SimpleDateFormat with German Locale - Java 8 vs Java 10+
我在遗留应用程序中有代码和测试用例,可以总结如下:
@Test
public void testParseDate() throws ParseException {
String toParse = "Mo Aug 18 11:25:26 MESZ +0200 2014";
String pattern = "EEE MMM dd HH:mm:ss z Z yyyy";
DateFormat dateFormatter = new SimpleDateFormat(pattern, Locale.GERMANY);
Date date = dateFormatter.parse(toParse);
//skipped assumptions
}
此测试在 Java 8 及更低版本中通过。但是,对于Java 10,这会导致.java.text.ParseException: Unparseable date: "Mo Aug 18 11:25:26 MESZ +0200 2014"
记录在案:此外,还为语言环境 、 、 引发异常。de_DE
de_CH
de_AT
de_LU
我知道这样一个事实,即JDK 9(JEP 252)更改了日期格式。但是,我认为这是一个破坏性的更改,破坏了向后兼容性。摘录:
在 JDK 9 中,Unicode 联盟的公共区域设置数据存储库 (CLDR) 数据被启用为默认区域设置数据,以便您可以使用标准区域设置数据而无需任何进一步的操作。
在 JDK 8 中,尽管 CLDR 语言环境数据与 JRE 捆绑在一起,但默认情况下不启用它。
使用区分区域设置的服务(如日期、时间和数字格式设置)的代码可能会对 CLDR 区域设置数据产生不同的结果。
在星期几 () 中添加 a 可补偿这一点,测试将通过。但是,这不是旧数据(以序列化形式,如 XML)的真正解决方案。.
Mo.
检查此堆栈溢出帖子,似乎该行为是德语区域设置的故意行为,可以通过指定 with mode 来缓解。但是,我不喜欢依赖某些系统属性值的想法,因为它可能有两个原因:java.locale.providers
COMPAT
- JDK 的下一个版本中的更改。
- 在不同的环境中被遗忘。
我的问题是:
- 如何保持遗留代码与此特定日期模式的向后兼容性,而无需重写/修改现有的序列化数据或添加/更改系统属性(如 ),这些属性可能会在不同的环境(应用程序服务器,独立jar等)中被遗忘?
java.locale.providers