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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:39:55