2017-09-15 38 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之前识别任何问题。 –