下面是代码片段
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());
这段代码在JDK8中运行良好,而在JDK17中则会出现以下异常
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)
1条答案
按热度按时间dm7nw8vv1#
tl;dr
2019年2月20日7时14分6秒+1秒
详细信息
您的问题与Java 8和Java 17无关。
提示:在指责那些被正式指定、被大量测试套件彻底测试、每天被数百万程序员使用的软件之前,先怀疑一下你自己的代码。
第一个月
指定
Locale
。区域设置决定翻译月份名称等时所使用的人类语言和文化规范。如果您不指定Locale,JVM的当前默认值将被隐式应用。我敢打赌,当您在不同时间或在不同机器上运行应用时,JVM的当前默认值
Locale
会发生变化。见此code run at Ideone.com.
2019年2月20日7时14分6秒+1秒
RFC 1123标准
正如Ole V. V.所评论的,您的格式恰好符合legacy标准RFC 1123、RFC 822和RFC 2822。
DateTimeFormatter
类携带该格式的预定义格式化程序对象。请参阅常量DateTimeFormatter.RFC_1123_DATE_TIME
。这个预定义的格式化程序已经有了RFC规范所要求的基于英语的语言环境,所以**不需要在这里指定一个
Locale
**对象。见此code run at Ideone.com。
2019年2月20日7时14分6秒+1秒
ISO 8601标准
现代的协议使用ISO 8601而不是这种过时的格式。java.time 类在解析/生成文本时默认使用ISO 8601格式。
我建议您教育您的数据发布者,让他们了解仅使用ISO 8601标准格式以文本方式传递日期-时间值的优点。