2014-10-02 24 views
6

benim bazı yöntemini test ederken garip bir sorunu karşısında koşuyoruz ile düzgün çalışmıyor ve benim konuyla ilgili somut bir örnek elde etmek mümkün olmuştur görünüyor.LOCALDATE ve DateTimeFormatter Japon yerel ayar

Ben yerel tanımlanan o kendi tarih modelini kullanarak bir tarih ayrıştırmak mümkün değildir ja_JP_JP_#u-ca-japanese yerel kullanıyorum.

Yanlış bir şey yapıyorum olup olmadığını merak ya ediyorum bu bir JDK hata ise.

ja_JP_JP_#u-ca-japanese inşa etmek amacıyla lütfen unutmayın, sen the Locale javadoc dan alıntı başına new Locale("ja", "JP", "JP") kullanmak gerekir:

Özel durumlar

uyumluluk nedenleriyle

, iki uygun olmayan yerel ayarlar özel durum olarak muamele görürler . Bunlar ja_JP_JP ve th_TH_TH. Bunlar, varyantlar çok kısa olduğu için BCP 47'de kötü biçimlendirilmiştir. BCP 47'ye göçü kolaylaştırmak için, bunlar özellikle inşaat sırasında ele alınır. Bu iki durum (ve yalnızca bunlar) bir kurucunun bir uzantı oluşturmasına neden olur, diğer tüm değerler de Java 7'den önce olduğu gibi davranır.

Java, Japonca Japonca takvimi ile birlikte Japonca'yı temsil etmek için ja_JP_JP'yi kullandı. . Bu, Unicode yerel ayar anahtarını ca ("takvim" için) belirterek ve Japonca yazarak artık bir Unicode yerel uzantı kullanılarak temsil edilebilir. Yerel yapıcı argümanlar "Evet" çağrıldığında, "JP", "JP", uzantı, "u-ca-Japon" otomatik olarak eklenir.

Java Tay basamağı ile birlikte Tayland'da kullanıldığı gibi Tay temsil etmek th_TH_TH kullandı. Bu ve değer Tay ("sayı" için) Tek kodlu yerel anahtar nu belirterek, Unicode yerel uzantısı kullanılarak da artık sunulabilen. Yerel yapıcı argümanlar "th" çağrıldığında, "TH", "TH", uzantı, "u-nu-Tay" otomatik olarak eklenir.

sorunu gösterir verilen test durumu:

@Test 
public void testJapaneseLocale() { 
    LocalDate specificLocalDate = LocalDate.of(2014, 10, 2); 
    Locale jpLocale = new Locale("ja", "JP", "JP"); 

    DateTimeFormatter jpDateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(jpLocale); 
    String jpDate = specificLocalDate.format(jpDateTimeFormatter); 

    String jpPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, Chronology.ofLocale(jpLocale), jpLocale); 
    LocalDate jpLocalDate = LocalDate.parse(jpDate, DateTimeFormatter.ofPattern(jpPattern, jpLocale)); 

    assertEquals(specificLocalDate, jpLocalDate); 
} 

Bu kod vb ingilizce olarak diğer normal yerel ayar, için çalışır

cevap

4

yuvarlak açma yeteneği yapar çalışır, ancak Kullanılacak olan tüm verilere ihtiyacı var.

LocalDate date = LocalDate.of(2014, 10, 2); 
Locale jpLocale = new Locale("ja", "JP", "JP"); 
Chronology chrono = Chronology.ofLocale(jpLocale); 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) 
     .withLocale(jpLocale) 
     .withChronology(chrono); 
String jpDateStr = date.format(f); 
LocalDate result = LocalDate.parse(jpDateStr, f); 

aynı ofPattern() kullanılarak ikinci durumda, doğrudur yerel kilitler: İlk durumda

, sen withLocale() ve withChronology() yöntemler kullanılarak locale ve hem kronoloji belirtmeniz gerekir ancak kronoloji: yerel ve kronoloji hem de mevcuttur ve yuvarlak mümkün açma kullanılan Sadece

String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
    FormatStyle.SHORT, null, chrono, jpLocale); 
DateTimeFormatter f = DateTimeFormatter.ofPattern(pattern, jpLocale) 
    .withChronology(chrono); 
LocalDate jpLocalDate = LocalDate.parse(jpDateStr, f); 

. Sorununuz, Japon yerel ayarını kullanarak biçimlendirmeye çalışmaktan ziyade Japon kronolojisini tutarsız bir şekilde uygulamaktan kaynaklanmaktadır.