0

我正在尝试使用带有时区偏移的 Instant.parse() 解析日期时间。我阅读了文档,它说我必须使用 ISO-8601 来做到这一点。我阅读了维基百科的 ISO-8601 文章,并从那里复制了这个日期时间“2007-11-03T13:18:05-03:00”,并将它与 parse() 方法一起使用。该调用抛出异常,表示无法解析该参数。我不明白为什么会这样。有人可以帮我吗?

4

2 回答 2

1

编辑:正如@Tom 在评论中指出的那样,从 Java 12 开始,我们可以简单地做:

    System.out.println(Instant.parse("2007-11-03T13:18:05-03:00"));

输出是:

2007-11-03T16:18:05Z

原始答案:另一种选择(Java 版本不超过 11)是:

    Instant yourInstant = DateTimeFormatter.ISO_OFFSET_DATE_TIME
            .parse("2007-11-03T13:18:05-03:00", Instant::from);
    System.out.println(yourInstant);

输出与上面相同。

更喜欢哪个?我认为这是一个品味问题。

于 2021-07-02T07:59:15.043 回答
0

tl;博士

OffsetDateTime 
.parse(
    "2007-11-03T13:18:05-03:00"
)
.toInstant()
.toString() 

细节

-03:00字符串末尾的表示"2007-11-03T13:18:05-03:00"落后 UTC 三个小时的偏移量。

该类Instant表示在 UTC 看到的时刻,零时分秒的偏移量。

改用OffsetDateTime类。

OffsetDateTime odt = OffsetDateTime.parse( "2007-11-03T13:18:05-03:00" ) ;

要调整到零偏移量,请提取Instant.

Instant instant = odt.toInstant() ;

要生成带有标准 ISO 8601 格式文本的字符串,请调用toString().

String output = instant.toString() ;

对于具有时区而不仅仅是偏移量的日期时间值,请使用ZonedDateTime类。

仅对于日期和时间,但缺少偏移量或区域的上下文,请使用LocalDateTime.

于 2021-07-02T00:49:31.727 回答