2

我正在尝试编写一个DateTimeFormatter来解析以下格式:

2020-05-29T07:51:33.106-07:00

我看过ISO_OFFSET_DATE_TIME,但问题是它不包含毫秒。所以我决定自己写。

没有时区很容易做到这一点:

public static void main (String[] args) throws java.lang.Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    System.out.println(
        LocalDateTime.parse("2020-05-29T07:51:33.106", formatter)
    );
}

它工作得很好

但是当我尝试以如下格式添加时区时

public static void main (String[] args) throws java.lang.Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    System.out.println(
        LocalDateTime.parse("2020-05-29T07:51:33.106-07:00", formatter)
    );
}

它现在失败,但时区无法解析。

Exception in thread "main" java.time.format.DateTimeParseException: Text '2020-05-29T07:51:33.106-07:00' could not be parsed at index 23
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1951)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at Ideone.main(Main.java:16)

如何以这种格式解析时区?

4

2 回答 2

6

tl;博士

无需定义格式化程序。

OffsetDateTime.parse( "2020-05-29T07:51:33.106-07:00" )

细节

Jim Garrison的回答是正确的。此外,您使用了错误的类。

该类LocalDateTime仅表示带有时间的日期,仅此而已。此类故意缺少任何时区或与 UTC 偏移的概念。因此,这个类不能代表一个时刻,不是时间轴上的一个点。

在此处输入图像描述

因此,将带有偏移量的字符串解析-07:00为 aLocalDateTime是没有意义的。偏移量的有价值信息将被忽略、丢弃。

相反,解析为OffsetDateTime.

奖励:您的整个格式化程序问题变得毫无意义。您的输入字符串符合OffsetDateTime解析/生成字符串时默认在类中使用的标准 ISO 8601 格式。您根本不需要定义任何自定义格式模式。

OffsetDateTime.parse( "2020-05-29T07:51:33.106-07:00" )

…和:

myOffsetDateTime.toString() 

你说:

但是当我尝试添加时区时

不,您在 string 中添加了与 UTC 的偏移量,而不是时区-07:00

  • 偏移量只是本初子午线之前或之后的小时-分钟-秒数。
  • 时区更多。时区有一个名称,例如 America/Edmonton。时区具有特定地区人们使用的挂钟时间偏移的过去、现在和未来变化的历史。
于 2020-05-31T17:55:54.117 回答
5

来自 Javadoc(强调我的):

偏移 Z:这会根据图案字母的数量来格式化偏移。一个、两个或三个字母输出小时和分钟,不带冒号,例如'+0130'。当偏移量为零时,输出将为“+0000”。四个字母输出本地化偏移的完整形式,相当于四个字母的Offset-O。如果偏移量为零,则输出将是相应的本地化偏移量文本。五个字母输出小时、分钟,如果非零,则可选秒,带冒号。如果偏移量为零,则输出“Z”。六个或更多字母会引发 IllegalArgumentException。

将单曲Z改为ZZZZZ.

于 2020-05-31T16:16:18.947 回答