为什么 java8 中具有时区行为的 Instant.parse() 字符串与 java 17 不同

off*_*zaz 0 java timezone-offset java-8 java-time java-17

下面的代码片段

Instant.parse("2023-08-08T00:00:00+02:00")
Run Code Online (Sandbox Code Playgroud)

按照 java-17 中的预期进行编译和执行。但是用java-8执行时,抛出以下异常

java.time.format.DateTimeParseException: Text '2023-08-01T00:00:00+02:00' could not be parsed at index 19

    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.Instant.parse(Instant.java:395)
    ...
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么?java.time api 有什么变化吗?

请注意,我确实知道解决此问题的方法,以下代码适用于 java-8

OffsetDateTime.parse("2023-08-01T00:00:00+02:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME).toInstant()
Run Code Online (Sandbox Code Playgroud)

它产生了期望的结果。我有兴趣知道在 java-time api 实现中,行为是否已经改变?

k31*_*159 6

这是 Java 12 中修复的一个错误:

JDK-8166138:DateTimeFormatter.ISO_INSTANT 应该处理偏移量

版本 8 到 11 将抛出此异常,而从 12 开始的版本将接受时区偏移。

正如文档所述,该Instant.parse方法使用DateTimeFormatter.ISO_INSTANT解析器。后者在版本1112之间进行了更改(请参阅链接)。在版本12中,在ISO_INSTANT解析器的描述中添加了以下句子:

解析时,DateTimeFormatterBuilder.appendOffsetId() 的行为将用于解析偏移量,根据需要将即时转换为 UTC。