下面的代码片段在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的问题是,以秒为单位的字段不判断其最小宽度.如果您在DateTimeFormatterBuilder中做appendFraction(NANO_OF_SECOND, 3, 3, false),则该字段将全部接受1、2或3位数字.

DateTimeFormatter在引擎盖下使用DateTimeFormatterBuilder,因此它也会受到影响.你的模式中的SSS最终会导致DateTimeFormatterBuilder上的appendFraction(NANO_OF_SECOND, 3, 3, false)这样的呼叫.

如果你需要旧的行为,你可以用你自己的最小位数拨打appendFraction.

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH[:mm[:ss[")
        .appendFraction(ChronoField.NANO_OF_SECOND, 1, 3, true)
        .appendPattern("]]]X")
        .toFormatter();

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

gitlab ci不会运行我的脚本,因为它需要数据库连接'

转换为Biggram

Junit with Mockito for java

我需要生成一个文件来整合每个特性执行的所有JSON结果

FALSE:它应该在什么时候使用?

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

如何从错误通道回复网关,使其不会挂起

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

如何生成指定范围内的11位序列号?

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

无限递归Java问题

控制器建议异常处理

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

始终使用Spring Boot连接mongodb上的测试数据库

如何使用Jackson读取以方括号开头的JSON?