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