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
相关产品推荐
相关产品推荐

