Tim*_*ett 5 java locale cldr 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
在调试器中花费了很长时间后,我将此追溯到此提交:8251317:支持 CLDR 版本 38
此提交将上下文相关形式和独立形式的 September 缩写形式make/data/cldr/common/main/en_GB.xml从更改Sep为。Sept其他月份都没有被触及,保留为 3 个字符。
我已经证实这确实是CLDR 版本 37 和 38之间的真正变化,尽管我不确定我们英国人何时开始使用 4 个字母作为 9 月的 3 字母缩写......
现在这很烦人,因为它破坏了我的数据文件处理(尽管我怀疑我可以通过Locale.ENGLISH在代码中指定而不是使用默认区域设置来修复它),但我无法确定它是否算作一个已引入的错误打破了我可靠的 3 字符月匹配模式,或者这是否真的意味着一个功能。
JavaDoc 说:
文本:文本样式根据使用的模式字母的数量确定。少于 4 个模式字母将使用缩写形式。...
然后:
数字/文本:如果模式字母的数量为 3 或更多,请使用上面的文本规则。否则请使用上面的编号规则。
我的遗憾是我从来没有仔细阅读过这篇文章,没有发现文本值的处理方式与数字不同,其中模式中的字母数量设置了宽度。但这让我想知道在输出一个月时应该如何指定固定数量的字符,同样为什么它不能在解析时宽容并接受三字符形式而不是抛出异常?
归根结底,这对我来说仍然感觉像是一种回归。我的代码多年来一直可靠地解析包含 3 个字符的月份的日期,现在没有任何警告,但在 9 月份的所有日期上都失败了。我认为这感觉不正确是错误的吗?
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |