gpt4 book ai didi

Java 8 日期和时间 : parse ISO 8601 string without colon in offset

转载 作者:太空宇宙 更新时间:2023-11-04 11:03:18 25 4
gpt4 key购买 nike

我们尝试解析以下带有时区偏移的 ISO 8601 DateTime 字符串:

final String input = "2022-03-17T23:00:00.000+0000";

OffsetDateTime.parse(input);
LocalDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);

由于时区偏移中的冒号,两种方法都会失败(这是有道理的,因为 OffsetDateTime 也使用 DateTimeFormatter.ISO_OFFSET_DATE_TIME )。

java.time.format.DateTimeParseException: Text '2022-03-17T23:00:00.000+0000' could not be parsed at index 23

但是根据Wikipedia时区偏移量有 4 种有效格式:

<time>Z 
<time>±hh:mm
<time>±hhmm
<time>±hh

其他框架/语言可以毫无问题地解析此字符串,例如JavaScript Date()或 jackson ISO8601Utils (他们讨论了这个问题here)

现在我们可以编写自己的 DateTimeFormatter具有复杂的正则表达式,但在我看来 java.time默认情况下,库应该能够解析这个有效的 ISO 8601 字符串,因为它是有效的。

现在我们使用 Jacksons ISO8601DateFormat ,但我们更愿意使用官方的date.time可以使用的库。您会采取什么方法来解决这个问题?

最佳答案

如果您想解析所有有效的偏移格式(Z±hh:mm±hhmm±hh),一种替代方法是使用带有可选模式的 java.time.format.DateTimeFormatterBuilder(不幸的是,似乎没有一个模式字母可以匹配所有这些字母):

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// date/time
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
// offset (hh:mm - "+00:00" when it's zero)
.optionalStart().appendOffset("+HH:MM", "+00:00").optionalEnd()
// offset (hhmm - "+0000" when it's zero)
.optionalStart().appendOffset("+HHMM", "+0000").optionalEnd()
// offset (hh - "Z" when it's zero)
.optionalStart().appendOffset("+HH", "Z").optionalEnd()
// create formatter
.toFormatter();
System.out.println(OffsetDateTime.parse("2022-03-17T23:00:00.000+0000", formatter));
System.out.println(OffsetDateTime.parse("2022-03-17T23:00:00.000+00", formatter));
System.out.println(OffsetDateTime.parse("2022-03-17T23:00:00.000+00:00", formatter));
System.out.println(OffsetDateTime.parse("2022-03-17T23:00:00.000Z", formatter));

以上四种情况都会将其解析为 2022-03-17T23:00Z

<小时/>

如果需要,您还可以定义单个字符串模式,使用 [] 来分隔可选部分:

// formatter with all possible offset patterns
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS[xxx][xx][X]");

此格式化程序也适用于所有情况,就像上面的格式化程序一样。检查javadoc获取有关每种模式的更多详细信息。

<小时/>

注释:

  • 像上面这样的带有可选部分的格式化程序有利于解析,但不利于格式化。格式化时,它将打印所有可选部分,这意味着它将多次打印偏移量。因此,要格式化日期,只需使用另一个格式化程序即可。
  • 第二个格式化程序仅接受小数点后 3 位数字(因为 .SSS)。另一方面,ISO_LOCAL_DATE_TIME 更灵活:秒和纳秒是可选的,并且它还接受小数点后 0 到 9 位数字。选择最适合您的输入数据的一种。

关于Java 8 日期和时间 : parse ISO 8601 string without colon in offset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com