解析偏移量为 Instant Java 11 的字符串

Parse string with offset to Instant Java 11

我正在尝试将以下字符串 2021-10-15T08:39:05+02:00 解析为 Instant 这可以使用 Java 15 无缝地工作,但会为 Java 11 抛出错误。

java.time.format.DateTimeParseException: Text '2021-10-19T11:06:35+02:00' could not be parsed at index 19

为什么会这样?

Instant.parse("2021-10-15T08:39:05+02:00");

编辑:Java 15

Instant.parse 说:

The string ... is parsed using DateTimeFormatter.ISO_INSTANT.

因此,请阅读 DateTimeFormatter.ISO_INSTANT 的文档:

  • Java 15

    When parsing, the behaviour of DateTimeFormatterBuilder.appendOffsetId() will be used to parse the offset, converting the instant to UTC as necessary

  • Java 11

    When parsing ... (nothing about how the offset is parsed)

两者之间的行为发生了变化,使 DateTimeFormatter.ISO_INSTANT(以及使用它的代码)接受更广泛的输入。

要从 Java 11 的字符串中获取 Instant,您可以先解析为 OffsetDateTime,然后使用 toInstant() 获取相应的 Instant.

这是因为 java.time.format.DateTimeFormatter.html#ISO_INSTANT,由 java.time.Instant#parse 内部使用,行为已更改以支持解析瞬间时的时区偏移。

您可以使用 Java1.8 开始的不同 Java 版本实现相同的行为 java.time.OffsetDateTime#parse chained with java.time.OffsetDateTime#toInstant:

Instant i = OffsetDateTime.parse("2021-10-15T08:39:05+02:00").toInstant();