java DateTimeFormatter无法在JDK 17中解析日期,而在JDK 8中则传递

omvjsjqw  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(253)

下面是代码片段

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)
dm7nw8vv

dm7nw8vv1#

tl;dr

OffsetDateTime
.parse( 
    "Wed, 20 Feb 2019 07:14:06 +0100" , 
    DateTimeFormatter.RFC_1123_DATE_TIME 
)
.toString()

2019年2月20日7时14分6秒+1秒

详细信息

您的问题与Java 8和Java 17无关。
提示:在指责那些被正式指定、被大量测试套件彻底测试、每天被数百万程序员使用的软件之前,先怀疑一下你自己的代码。

第一个月

指定Locale。区域设置决定翻译月份名称等时所使用的人类语言和文化规范。
如果您不指定Locale,JVM的当前默认值将被隐式应用。我敢打赌,当您在不同时间或在不同机器上运行应用时,JVM的当前默认值Locale会发生变化。

Locale locale = Locale.US ;
DateTimeFormatter formatter = 
    DateTimeFormatter
    .ofPattern( "EEE, d MMM yyyy HH:mm:ss Z" )
    .withLocale( locale );

String input = "Wed, 20 Feb 2019 07:14:06 +0100" ;
ZonedDateTime zdt = ZonedDateTime.parse( input , formatter ) ;
String output = zdt.toString() ;
System.out.println( output );

见此code run at Ideone.com.
2019年2月20日7时14分6秒+1秒

RFC 1123标准

正如Ole V. V.所评论的,您的格式恰好符合legacy标准RFC 1123RFC 822RFC 2822
DateTimeFormatter类携带该格式的预定义格式化程序对象。请参阅常量DateTimeFormatter.RFC_1123_DATE_TIME
这个预定义的格式化程序已经有了RFC规范所要求的基于英语的语言环境,所以**不需要在这里指定一个Locale**对象。

String input = "Wed, 20 Feb 2019 07:14:06 +0100" ;
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;

见此code run at Ideone.com
2019年2月20日7时14分6秒+1秒

ISO 8601标准

现代的协议使用ISO 8601而不是这种过时的格式。java.time 类在解析/生成文本时默认使用ISO 8601格式。
我建议您教育您的数据发布者,让他们了解仅使用ISO 8601标准格式以文本方式传递日期-时间值的优点。

相关问题