错误还是功能?解析本地化月份名称的 Java 16 DateTimeFormatter 问题

问题描述

我使用的是 en_GB 语言环境,但类似的问题也可能影响其他 en_XX 语言环境。

在 Java 15 下,以下代码有效: LocalDate.parse("10-Sep-17",DateTimeFormatter.ofPattern("dd-MMM-yy",Locale.UK));

在 Java 16 下,它给出:DateTimeParseException: Text '10-Sep-17' Could not be parsed at index 3

在调试器中花费很长时间后,我将其追溯到this commit8251317:支持 CLDR 版本 38

此提交将 make/data/cldr/common/main/en_GB.xml 中的九月缩写形式从 Sep 更改为 Sept,适用于上下文相关形式和独立形式。其他月份都没动,剩下3个字符。

我已经确认这确实是 CLDR versions 37 and 38间的真正变化,尽管我不确定我们英国人何时改用 4 个字母作为我们 9 月的 3 个字母缩写...

在这很烦人,因为它破坏了我的数据文件处理(虽然我怀疑我可以通过指定 Locale.ENGLISH 而不是在我的代码中使用认语言环境来修复它),但我无法决定它是否重要作为一个已引入的错误,它破坏了我可靠的 3 个字符-月匹配模式,或者这是否实际上是一个功能

JavaDoc 说:

文本:文本样式是根据使用的模式字母的数量确定的。少于 4 个模式字母将使用简写形式。 ...

及以后:

数字/文本:如果模式字母的数量是 3 个或更多,请使用上面的文本规则。否则使用上面的数字规则。

我的坏处是从来没有仔细阅读过这篇文章,以发现文本值的处理方式与数字不同,其中模式中的字母数设置了宽度。但这让我想知道你应该如何在输出一个月时指定固定数量的字符,同样为什么它不能在解析时接受三字符形式而不是抛出例外?

归根结底,这对我来说仍然是一种回归。我的代码多年来一直可靠地解析 3 个字符月份的日期,没有任何警告,但在 9 月的所有日期都失败了。我认为这感觉不正确是错误的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)