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

JDK17中DateTimeFormatter解析日期失败,JDK8正常运行的原因及解决

JDK17中DateTimeFormatter解析英文日期失败的原因与解决方法

原代码在JDK8环境可正常运行,但JDK17执行时抛出解析异常:

String date = "Wed, 20 Feb 2019 07:14:06 +0100";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z");
System.out.println(ZonedDateTime.parse(date, formatter).toString());

异常信息:

Text 'Wed, 20 Feb 2019 07:14:06 +0100' could not be parsed at index 0
java.time.format.DateTimeParseException: Text 'Wed, 20 Feb 2019 07:14:06 +0100' could not be parsed at index 0
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:600)

问题原因

核心原因是JDK版本间默认Locale的处理差异:

  • JDK8环境中,DateTimeFormatter.ofPattern()默认使用的JVM默认Locale多为英文,因此能识别英文星期缩写(Wed)和月份缩写(Feb)。
  • JDK17中,若JVM默认Locale为非英文(比如中文),DateTimeFormatter会采用对应Locale的日期规则解析,无法匹配英文格式的日期缩写,导致在索引0处(Wed位置)解析失败。

解决方法

最稳妥的方案是创建DateTimeFormatter时显式指定英文Locale,彻底规避运行环境默认Locale变化带来的问题:

String date = "Wed, 20 Feb 2019 07:14:06 +0100";
// 显式指定英文Locale,确保解析规则匹配英文日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
System.out.println(ZonedDateTime.parse(date, formatter).toString());

补充说明

也可以通过JVM启动参数设置默认Locale(如-Duser.language=en -Duser.country=US),但代码中显式指定Locale的方式更可靠,不受运行环境配置的影响。

内容的提问来源于stack exchange,提问作者Raghu K Nair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:45:23