为什么Java 9中带WAT时区的日期用SimpleDateFormat解析失败?
涉及的问题代码如下:
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); df.parse("Tue Nov 09 18:04:07 WAT 2021");
问题根因
- JDK 9正式将CLDR(Unicode通用区域数据仓库)设为默认的区域数据源,替代了此前JDK自带的JRE区域数据。9.0.2~9.0.4以及全版本JDK 10的CLDR数据中缺失了
WAT这类时区缩写的英文解析映射,导致SimpleDateFormat解析对应格式时间时报错,该bug在JDK 11中被正式修复。 - 9.0.1版本可正常运行,是因为该小版本还保留了旧的JRE区域数据作为优先数据源,没有完全切换到存在bug的CLDR版本。
无需大面积修改的适配方案
方案1:添加JVM启动参数(零代码修改,优先推荐)
在应用启动的JVM参数中添加如下配置,即可回退到兼容Java 8的区域数据规则,不需要修改任何业务代码:
-Djava.locale.providers=COMPAT,CLDR
该参数会调整区域数据源的优先级,优先使用旧版JRE兼容的区域数据,完全匹配Java 8的时间解析行为。
方案2:显式指定英文Locale
如果仅少量代码涉及该类时间解析逻辑,可以在初始化SimpleDateFormat时显式指定英文区域,避免受默认区域规则影响:
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US); df.parse("Tue Nov 09 18:04:07 WAT 2021");
方案3:升级JDK版本
该解析bug在JDK 11及以上版本中已经被官方修复,如果应用可接受JDK大版本升级,直接升级即可解决问题,无需修改任何配置或代码。
内容的提问来源于stack exchange,提问作者Gibbs
相关产品推荐
相关产品推荐

