代码之家  ›  专栏  ›  技术社区  ›  office.aizaz

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

  •  0
  • office.aizaz  · 技术社区  · 1 年前

    以下代码片段

    Instant.parse("2023-08-08T00:00:00+02:00")
    

    按照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)
        ...
    

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

    请注意,我确实知道解决这个问题的方法,下面的代码在java-8中工作

    OffsetDateTime.parse("2023-08-01T00:00:00+02:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME).toInstant()
    

    它产生了所需的结果。我很想知道在java时间api实现中,行为是否已经改变?

    1 回复  |  直到 1 年前
        1
  •  3
  •   k314159    1 年前

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

    JDK-8166138: DateTimeFormatter.ISO_INSTANT should handle offsets

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

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

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