2017-09-15 93 views
13

我已經在Java 8(1.8.0_77)和Java 9(Java HotSpot™64位服務器虛擬機(構建9 + 181,混合模式))中嘗試了一些代碼, )JDK dateformater解析德語語言環境DayOfWeek,java8 vs java9

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN); 
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from); 
System.out.println("mo = " + mo); 

我不是太熟悉這些類的細節,但在Java 8這部作品,印刷:

月=星期一

在Java 9,但是它失敗

在線程 「主」 java.time.format.DateTimeParseException異常:文本 '沫' 不能在索引0 在java.base被解析/ java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java :1988) 在java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) 在day.main(day.java:10)

任何想法,這是重現?使用此代碼 :

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN); 
String format = dtf.format(DayOfWeek.MONDAY); 
System.out.println("format = " + format); 

jdk1.8.0-77:

所以,當在格式化

格式=沫

JDK-9(建立9 + 181 )

forma T =密蘇里州

+2

https://ideone.com/6t60j1你確定java-8嗎? – 2017-09-15 17:27:59

+0

以及我用1.8.0_77。有沒有可能在這個網站上使用這個版本? – user140547

+0

Ideone提供了一些你無法控制的版本。 (和服務已經非常好恕我直言) – 2017-09-15 17:30:53

回答

10

這似乎是有在由於目前執行的CLDR date-time-patternsJEP - 252執行該條規定

從Unicode協會的通用語言環境數據 庫使用的語言環境數據(CLDR)。

用於顯示格式和翻譯的本地化模式 字符串(如區域設置名稱)在某些語言環境中可能會有所不同。

要實現與JDK 8兼容的行爲, 屬性java.locale.providers將系統設置爲與領先CLDR的COMPAT值。


而第二它的數據部分,它具有以下相關資料可以證明這的行爲是故意的international components for Unicode in German locale -

enter image description here

編輯/注:由@ManiGrover鏈接,migration guide陳述類似的警告這種實施tations -

如果您的應用程序成功啓動後,在您的測試 仔細看,並確保該行爲是一樣的JDK 8例如, 一些早期使用者已經注意到,他們的日期和貨幣都 格式不同。請參閱Use CLDR Locale Data by Default.

+2

從https://docs.oracle.com/javase/9​​/migrate/toc.htm#JSMIG-GUID-AFD3BDEC-99FC-4F3C-946F-A1CD2D05B74B 「If您的應用程序將成功啓動,仔細查看測試並確保其行爲與JDK 8相同。例如,一些早期使用者已注意到他們的日期和貨幣格式不同,請參閱默認情況下使用CLDR區域設置數據。 –

6

沒有點的縮寫「Mo」,「Di」等沒有在CLDR中消失,但可通過獨立模式訪問。 你應該使用獨立的格式符號「C」的「E」,而不是改變你的模式:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ccc", Locale.GERMAN); 
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from); 

事實上,我認爲是打破向後兼容性(具體爲行爲休息)基礎數據的變化。

+5

默認情況下轉換爲使用CDLR語言環境數據確實是一種顛覆性變化。 JDK 8包含CDLR語言環境數據,因此您可以使用'-Djava.locale.providers = CLDR'運行,以在移至JDK 9之前識別任何問題。 –