Java17 en_GB区域下无法解析September缩写Sep的问题咨询
问题根因
这个异常是Java版本升级带来的区域本地化数据变更导致的:
- Java 17默认使用更新版本的CLDR(Unicode通用区域数据仓库)作为本地化数据来源,你使用的Java 11版本要么默认采用JRE自带的兼容型区域数据,要么内置的CLDR版本更旧
- 旧版区域数据中en_GB locale下September的标准缩写为
Sep,但更新后的CLDR规范中,en_GB locale下September的标准缩写调整为Sept,所以输入Sep 29, 1988无法匹配格式规则,直接在索引0位置抛出解析异常。
可行解决方案
按需选择以下任意一种方案修复即可:
- 调整输入的月份缩写为符合当前CLDR规范的格式,将
Sep 29, 1988修改为Sept 29, 1988 - 给DateTimeFormatter开启宽松解析模式,降低匹配规则严格度:
DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd, yyyy") .withLocale(Locale.UK) .withResolverStyle(ResolverStyle.LENIENT);
- 启动JVM时指定区域数据优先级,回退到旧版兼容数据作为默认来源,添加JVM启动参数:
-Djava.locale.providers=COMPAT,CLDR
内容的提问来源于stack exchange,提问作者steven35
相关产品推荐
相关产品推荐

