JDK dateformatter 解析 DayOfWeek in German locale, java8 vs java9

2022-09-03 01:19:41

我已经尝试了Java 8(1.8.0_77)和Java 9(Java HotSpot(TM)64位服务器VM(build 9 + 181,混合模式)中的一些代码。

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

我不太熟悉这些类的细节,但是在Java 8中,这可以工作,打印:

mo = 星期一

然而,在Java 9中,它失败了。

线程 “main” java.time.format.DateTimeParseException 中的异常:文本 'Mo' 无法在 java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988) at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) at 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)

格式 = 钼。


答案 1

这似乎在中存在,因为当前实现CLDR日期 - 时间模式JEP - 252的实现,其中指出

默认情况下,使用 Unicode 联盟的通用区域设置数据存储库 (CLDR) 中的区域设置数据。

用于设置显示字符串格式和翻译的本地化模式(如区域设置名称)在某些区域设置中可能有所不同。

要启用与 JDK 8 兼容的行为,请将系统属性设置为 COMPAT 在 CLDR 之前的值。java.locale.providers


为了支持它的数据部分,德语语言环境中Unicode的国际组件具有以下相关信息,可以证明该行为是故意的 -

enter image description here

编辑/注意:如注释中的链接所示,迁移指南为此类实现声明了类似的警告 -

如果应用程序成功启动,请仔细查看测试并确保行为与 JDK 8 上的行为相同。例如,一些早期采用者已经注意到他们的日期和货币的格式不同。请参见默认情况下使用 CLDR 区域设置数据。


答案 2

没有点的缩写“Mo”,“Di”等在CLDR中没有消失,但可以通过独立模式访问。您应该使用独立格式符号“c”而不是“e”来更改模式

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

事实上,我认为基础数据的更改会破坏向后兼容性(具体到行为中断)。


推荐