5

我正在使用 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

在调试器中花了很长时间后,我将其追溯到此提交8251317:支持 CLDR 版本 38

此提交将上下文相关和独立形式的九月的缩写形式make/data/cldr/common/main/en_GB.xmlSep更改为 。Sept其他月份均未触及,保留为 3 个字符。

我已经证实这确实是CLDR 版本 37 和 38之间的真正变化,尽管我不确定我们英国人何时切换到使用 4 个字母作为 9 月的 3 个字母缩写......

现在这很烦人,因为它破坏了我的数据文件处理(尽管我怀疑我可以通过Locale.ENGLISH在代码中指定而不是使用默认语言环境来修复它),但我无法确定它是否算作已经引入的错误打破了我可靠的 3 个字符月匹配模式,或者这是否真的是一个功能。

JavaDoc 说:

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

然后:

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

我从来没有仔细阅读过这篇文章以发现文本值的处理方式与数字不同,因为数字中的字母数量决定了宽度。但这让我想知道在输出一个月应该如何指定固定数量的字符,以及为什么在解析时不能允许并接受三字符形式而不是抛出异常?

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

4

0 回答 0