2015-09-29 27 views
6

Tamamlanmamış tarihi yalnızca ayın kesinliğine göre biçimlendirmem gerekiyor. İlk tahminim ona "MMMM yyyy" desen uygulamaktı. Bu, birçok yerel (İngilizce, Almanca, ...) için iyi çalışır, ancak fleksiyona sahip diller için çirkin bir sonuç verir, ör. Rusça. documentation of SimpleDateFormat'u okudum ve 'L' 'ye bağlam-duyarsız ay adı vermesi gerektiğini öğrendim: sadece desene ihtiyacım var, çünkü desende ayın günü yok. Bu yüzden "LLLL yyyy" desenini denedim. Rusça ve diğer fleksiyon dilleri için mükemmel çalışır, ancak bunun yerine, örn. Düzgün 'tr' ve 'de' iş:Java tarih biçiminde ay adının bağımsız formu

import java.text.*; 
import java.util.*; 

public class test 
{ 
    public static void main (String[] arguments) throws Exception 
    { 
     for (String locale : new String[] { "en", "de", "hu", "it", "ru", "fi", "pl" }) 
      System.out.format ("%s: %s \t%s\n", locale, 
           new SimpleDateFormat ("MMMM yyyy", new Locale (locale)).format (new Date()), 
           new SimpleDateFormat ("LLLL yyyy", new Locale (locale)).format (new Date())); 
    } 
} 

Ve çıkış: Test edilen yerler için Yani

en: September 2015  0009 2015 
de: September 2015  0009 2015 
hu: szeptember 2015  szeptember 2015 
it: settembre 2015  Settembre 2015 
ru: сентября 2015  Сентябрь 2015 
fi: syyskuuta 2015  syyskuu 2015 
pl: września 2015  wrzesień 2015 

, İngilizce ve Almanca ... İşte

Test kodudur sadece 'M' ile, 'hu' hem 'M' hem de 'L' ile iyidir, 'bu' muhtemelen 'L' ile daha iyi durumdadır (burada büyük harfin ne kadar olduğunu bilmiyorum), 'ru' ise, 'fi' ve 'pl' sadece 'L' ile doğru çıktı verir (bu sadece Rusça ve Lehçe için gerçekten söyleyebilirim, fakat Fin dilinde benzer olduğunu varsayalım).

Sorular: Tüm yerel ayarlar için düzgün

  • Ben SimpleDateFormat yapmak için bir şey yapabilir miyim

    veya benzer tarih biçimlendirme sınıf muamele 'L'? Alternatif olarak, herhangi bir yerel ayar için 'M' veya 'L' kullanılmasının gerekli olup olmadığını anlamanın basit bir yolu var mıdır?

+0

Rusça bilmiyorum ama M 'tanımlayıcısının yanlış bir ay ismi verdiğini mi söylüyorsunuz? 'Сентября' ve 'Сентябрь' arasındaki anlamdaki fark nedir? – Tunaki

+1

Fince ile aynı. Ayın adı syyskuu. Ancak, bahsedilen bir gün varsa, şu şekilde olmalıdır: 15. syyskuuta (bu, bağımsız biçime karşı bağlama duyarlılık anlamındadır). –

+1

Java 8'in hangi sürümünü kullanıyorsunuz? “L” sadece Java 8'de tanıtıldı ve makinemde programınız “en” ve “de” için “Eylül” üretiyor. Belki güncel olmayan yerel dosyalara sahip bir sürümünüz var mı? – RealSkeptic

cevap

3

Resmi bir hata olduğunu - hata durumundayken JDK-8075548

"çözülmesi" ve düzeltme sürümleri 8_60 ve 8_65 ancak Java 8'in değil önceki sürümlerine backported edildiğini görebilirsiniz Bu nedenle, uygun çözüm, mümkünse, Java 1.8.0_60'a yükseltmektir.

+0

Evet, 60'ın beklendiği gibi çalışıyor. Teşekkür ederim. – doublep

0

java.time

SimpleDateFormat sınıf java.time sınıfları supplanted şimdi eski olan zahmetli eski tarih-saat sınıfları, bir parçasıdır.

Java.time'da, biçimlendirme düzeni kodları eskilere benzer ancak hemen hemen aynıdır. DateTimeFormatter için sınıf dokümanı okuduğunuzdan emin olun.

tr

final DateTimeFormatter fCombo = DateTimeFormatter.ofPattern ("MMMM uuuu"); 
final DateTimeFormatter fStandalone = DateTimeFormatter.ofPattern ("LLLL uuuu"); 

final LocalDate localDate = LocalDate.now (ZoneId.of ("America/Montreal")); 
for (final String locale : new String[] { "en" , "fr" , "de" , "hu" , "it" , "ru" , "fi" , "pl" }) { 
    final Locale l = new Locale (locale); 

    System.out.format (
      "%s: %s | %s\n", 
      locale, 
      localDate.format (fCombo.withLocale (l)), 
      localDate.format (fStandalone.withLocale (l)) 
    ); 
} 
: 2017 Mart | 3 2017

fr: mars 2017 | 3 2017

ama

: 2017 März | 2017

tr 3: 2017 Mart | Mart 2017

o: Mart 2017 | Marzo 2017

ru: марта 2017 | 2017 Март

fi: maaliskuuta 2017 | Maaliskuu 2017

örn marca 2017 |

java.time java.time çerçeve Hakkında

Marzec 2017 sonrası Java 8 ve yerleşiktir. Bu sınıflar Calendar, & SimpleDateFormat, eski Zahmetli legacy tarih-saat sınıfları java.util.Date Böyle yerini.

Joda-Time proje, şimdi maintenance mode yılında, java.time sınıflara göçü önerir. Daha fazla bilgi için

, Oracle Tutorial bkz. Taşma Stack ve örnekler ve birçok açıklamalar arayın. Şartname JSR 310 olduğunu.

Nerede java.time sınıfları elde etmek?

ThreeTen-Extra proje ilave sınıfları ile java.time uzanır.Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. Burada Interval, YearWeek, YearQuarter ve more gibi bazı yararlı sınıflar bulabilirsiniz.

İlgili konular