You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:36:08