以下代码片段在 Java 8 中运行没有错误。但是,当我在 Java 17 中运行相同的代码时,它会失败。
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
public class Main2 {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH[:mm[:ss[.SSS]]]X");
OffsetDateTime offSetDateTime = OffsetDateTime.parse("2021-10-09T08:59:00.00Z", formatter);
System.out.println(offSetDateTime);
}
}
在 Java 17 上运行时的输出:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-10-09T08:59:00.00Z' could not be parsed at index 19
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.OffsetDateTime.parse(OffsetDateTime.java:404)
at Main2.main(Main2.java:9)
但是,如果我针对 Java 8 运行相同的代码,则会给出以下结果:
2021-10-09T08:59Z
如果我将测试数据从 更改为"2021-10-09T08:59:00.00Z"
,"2021-10-09T08:59:00.000Z"
它可以在 Java 17 中运行。您知道 Java 17 中的哪些更改导致它失败吗?
此行为似乎是由JDK-8230136的修复引起的。
JDK-8230136 是秒分数字段不检查其最小宽度的问题。如果您输入
appendFraction(NANO_OF_SECOND, 3, 3, false)
,DateTimeFormatterBuilder
则该字段将接受 1、2 或 3 位数字。DateTimeFormatter
DateTimeFormatterBuilder
在幕后使用,因此它也会受到影响。你的模式SSS
中的最终会导致像appendFraction(NANO_OF_SECOND, 3, 3, false)
在DateTimeFormatterBuilder
.如果您需要旧的行为,您可以
appendFraction
使用自己的最小位数进行呼叫。