【问题标题】:JDK dateformatter parsing DayOfWeek in German locale, java8 vs java9JDK dateformatter 在德语语言环境中解析 DayOfWeek,java8 与 java9
【发布时间】:2017-09-15 17:21:11
【问题描述】:

我在 Java 8 (1.8.0_77) 和 Java 9 (Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)) 中尝试了一些代码

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 处解析文本“Mo” 在 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)

格式 = 月。

【问题讨论】:

  • ideone.com/6t60j1你确定java-8吗?
  • @Tom 您误解了 javadoc。 “eee”是格式样式的文本缩写(不像“ccc”那样独立)。
  • 我承认 OPs 代码适用于 Java 8 (1.8.0_131)。
  • 您是否尝试过使用“Mo”的第一个代码。在 Java 9 中?那样有用吗?如果是,那么缩写似乎已更改?
  • @Tom:是的,“Mo”。它适用于 JDK 9。无论如何,这似乎是一个突破性的变化。好吧,或者也许有一些标准来规定“莫”。是正确的版本,所以被改变了......

标签: java java-8 java-time java-9


【解决方案1】:

这似乎存在于 中,因为CLDR date-time-patterns 的当前实现与JEP - 252 的实现表明

使用来自 Unicode 联盟的通用语言环境数据的语言环境数据 默认存储库 (CLDR)。

显示格式和翻译的本地化模式 某些语言环境中的字符串(例如语言环境名称)可能不同。

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


对于其中的数据部分,具有以下相关信息的international components for Unicode in German locale 可以证明该行为是故意的 -

编辑/注意:如 cmets 中所链接,migration guide 对此类实现发出类似警告 -

如果您的应用程序成功启动,请仔细查看您的测试 并确保行为与 JDK 8 上的相同。例如, 很少有早期采用者注意到他们的日期和货币是 格式不同。见Use CLDR Locale Data by Default.

【讨论】:

  • 来自docs.oracle.com/javase/9/migrate/… "如果您的应用程序成功启动,请仔细查看您的测试并确保其行为与 JDK 8 上的相同。例如,一些早期采用者注意到他们的日期和货币的格式不同。请参阅默认使用 CLDR 区域设置数据。"
【解决方案2】:

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

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

确实,我认为基础数据的更改破坏了向后兼容性(具体为行为破坏)。

【讨论】:

  • 默认情况下使用 CDLR 语言环境数据的转变确实是一个破坏性的变化。 JDK 8 包含 CDLR 语言环境数据,因此您可以使用 -Djava.locale.providers=CLDR 运行以在迁移到 JDK 9 之前识别任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2014-04-26
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多