DateFormat.parse解析SHORT日期:JSE1.8与JSE17兼容问题及无代码修改方案咨询
JDK17 兼容 JDK8 SHORT 日期时间格式解析(无需修改代码)
问题背景
- JDK 1.8 中,通过
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)创建的格式化器,可正常解析格式为"12/11/2023 12:00 am"的字符串 - JDK 17 中,上述格式化器仅支持解析日期与时间间带逗号的格式
"12/11/2023, 12:00 am",无逗号的格式会解析失败 - 需求:不修改现有业务代码,让JDK17支持解析无逗号的SHORT日期时间格式
解决方案:通过JVM系统属性兼容旧行为
JDK9及以后版本默认采用CLDR(Unicode通用区域数据仓库)作为本地化数据来源,而JDK8及之前使用的是兼容旧版的本地化规则。要让JDK17恢复JDK8的SHORT日期时间格式解析逻辑,可在JVM启动时添加以下参数:
-Djava.locale.providers=COMPAT,CLDR,SPI
该参数指定JVM优先使用COMPAT(兼容旧版)的本地化数据,其次才是CLDR和SPI。这样DateFormat.getDateTimeInstance(SHORT, SHORT)生成的格式化器会沿用JDK8的格式规则,支持解析无逗号的"12/11/2023 12:00 am"字符串。
验证
保持原有代码不变:
DateFormat df = DateFormat.getDateTimeInstance(java.text.DateFormat.SHORT, java.text.DateFormat.SHORT); Date myDate = df.parse("12/11/2023 12:00 am"); System.out.println(df.format(myDate));
添加上述JVM启动参数后,JDK17环境下运行该代码即可正常解析并输出格式化后的日期时间。
注意事项
- 该参数会全局影响JVM的本地化行为,如果应用中有依赖CLDR新本地化规则的功能,需要评估兼容性影响
- 若仅需针对特定Locale调整,可通过设置对应Locale的日期时间格式系统属性(例如针对英文美国Locale:
-Djava.text.DateFormat.shortDateTimePatterns=MM/dd/yy h:mm a,MM/dd/yy,hh:mm a),但全局COMPAT参数的方式更简便直接
内容的提问来源于stack exchange,提问作者HockChai Lim
相关产品推荐
相关产品推荐

