Java 8 DateTimeFormatter:与“z”和“Z”模式字母混淆

问题描述 投票:0回答:2

我有日期字符串“2015-01-12T13:00:00.000+02:00”。 查看 JavaDoc 我看到以下内容:

z       time-zone name              zone-name         Pacific Standard Time; PST
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;


所以我怀疑要解析它我必须使用大写“Z”,因为我有+02:00:

中给出的区域格式
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000Z");

但是我得到了解析错误。

如果我使用小写“z”,它就可以工作:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000z")


有谁知道这是怎么回事吗?


代码:

DateTimeFormatter changetimeParser_Z = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000Z");
DateTimeFormatter changetimeParser_z = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000z");

String time = "2015-01-12T13:00:00.000+02:00";

ZonedDateTime time1 = ZonedDateTime.parse(time, changetimeParser_z);
System.out.println(time1);
ZonedDateTime time2 = ZonedDateTime.parse(time, changetimeParser_Z);

System.out.println(time2);


异常堆栈跟踪:

2015-01-12T13:00+02:00
java.time.format.DateTimeParseException: Text '2015-01-12T13:00:00.000+02:00' could not be parsed at index 23
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
java datetime-format zoneddatetime
2个回答
7
投票

我相信这是 Javadoc 中的一个错误,这部分是一个错误

Symbol  Meaning                     Presentation      Examples<br>
------  -------                     ------------      -------
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

因为如果您进一步阅读,您会找到偏移量的解释

Z

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

符合 RFC 822

对我来说,模式的行为应该与 SimpleDateFormat

相同

0
投票

您不需要
DateTimeFormatter

您的日期时间字符串

2015-01-12T13:00:00.000+02:00
采用
OffsetDateTime#parse
使用的默认格式:

从文本字符串中获取

OffsetDateTime
的实例,例如
2007-12-03T10:15:30+01:00

因此,您不需要明确使用

DateTimeFormatter

我应该使用什么符号来表示区域偏移?

您应该使用

X
解析非默认格式的偏移日期时间字符串中的区域偏移量。

区域偏移格式 图案
-08
X
-0830
XX
-08:30
XXX
-08:30:15
XXXXX

查看文档以了解更多信息。

演示:

class Main {
    public static void main(String args[]) {
        OffsetDateTime odt = OffsetDateTime.parse("2015-01-12T13:00:00.000+02:00");
        System.out.println(odt);

        // Examples of parsing an offset-date-time string that is not in the
        // default format:
        System.out.println(
                OffsetDateTime.parse("12/01/2015 13:00:00.000+02",
                        DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss.SSSX")));
        System.out.println(
                OffsetDateTime.parse("12/01/2015 13:00:00.000+0200",
                        DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss.SSSXX")));
        System.out.println(
                OffsetDateTime.parse("12/01/2015 13:00:00.000+02:00",
                        DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss.SSSXXX")));
        System.out.println(
                OffsetDateTime.parse("12/01/2015 13:00:00.000-08:30:15",
                        DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss.SSSXXXXX")));
    }
}

在具有 UTC 区域的 JVM 上执行时的输出:

2015-01-12T13:00+02:00
2015-01-12T13:00+02:00
2015-01-12T13:00+02:00
2015-01-12T13:00+02:00
2015-01-12T13:00-08:30:15

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.