Windows zulu8环境下同Locale使用SimpleDateFormat返回不同结果问题
Java 8 SimpleDateFormat周历取值异常问题排查与解决
问题现象
使用SimpleDateFormat处理日期时出现周历年份、周数取值异常,具体复现条件与表现如下:
- 复现环境:配置为美区的Windows设备,使用Zulu 8 1.8.0_282版本JDK(Oracle 8 JDK可复现相同问题)
- 异常表现:同一测试代码两种启动方式打印
Locale.getDefault()结果均为en_US,但SimpleDateFormat返回的周数、周历年份不一致;相同代码在Linux CentOS的Red Hat 1.8.0_272 OpenJDK上运行无异常。
根因分析
SimpleDateFormat默认使用Locale.getDefault(Locale.Category.FORMAT)作为默认区域设置,而非无参数的Locale.getDefault(),问题由Java 8的三类独立Locale分类机制导致:
- 初始测试代码仅打印了无参数的
Locale.getDefault(),未校验FORMAT分类的Locale取值 - 无参数启动时,FORMAT分类实际Locale为fr_FR,和en_US的周历计算规则存在差异,导致结果异常
- 添加
-Duser.language=en -Duser.country=US -Duser.variant=启动参数后,三类Locale统一为en_US,周历计算规则符合预期,因此输出结果不同
解决方案
启动JVM时添加以下参数,强制所有Locale分类统一为指定值即可解决问题:-Duser.language=en -Duser.country=US -Duser.variant=
内容的提问来源于stack exchange,提问作者lennelei
相关产品推荐
相关产品推荐

