如何使用DateTimeFormatter解析冒号?

问题描述 投票:3回答:3

我有以下字符串:String timeStamp = "2020-01-31 12:13:14 +03:00"。我试图使用Java 8 DateTimeFormatter解析它。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( format );
tmpTimestamp = ZonedDateTime.parse( timeStamp, formatter );

其中format是以下之一:

"yyyy-MM-dd' 'HH:mm:ss' 'Z",
"yyyy-MM-dd' 'HH:mm:ss' 'X",
"yyyy-MM-dd' 'HH:mm:ss' 'x",
"yyyy-MM-dd HH:mm:ss Z",
"yyyy-MM-dd HH:mm:ss X",
"yyyy-MM-dd HH:mm:ss x",

没有工作。我总是让DateTimeParseException指向偏移子串“+03:00”中的'+'或':'字符

根据JavaDocs:Class DateTimeFormatter“+03:00”应由以下任何一个支持:ZXx

那么问题是如何构造格式化字符串来解析它?

java datetime parsing java-8 dateformatter
3个回答
3
投票

你应该使用时间Xyyyy-MM-dd HH:mm:ss XXX):

String timeStamp = "2020-01-31 12:13:14 +03:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX");
ZonedDateTime tmpTimestamp = ZonedDateTime.parse(timeStamp, formatter);

来自docs

偏移X和x:根据模式字母的数量格式化偏移。

一个字母仅输出小时,例如'+01',除非分钟非零,在这种情况下分钟也输出,例如'+0130'。

两个字母输出小时和分钟,没有冒号,例如'+0130'。

三个字母输出小时和分钟,带有冒号,例如'+01:30'。

四个字母输出小时和分钟以及可选秒,没有冒号,例如'+013015'。

五个字母输出小时和分钟,可选秒输出冒号,例如'+01:30:15'。

六个或更多字母抛出IllegalArgumentException。

当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”,“+ 0000”或“+00” :00' 。

替代方案你可以使用五个字母(XXXXX),你也可以使用ZZZZZZZZ而不是XXXXXXXX


3
投票

来自javadoc

偏移Z:根据图案字母的数量格式化偏移。一个,两个或三个字母输出小时和分钟,没有冒号,例如'+0130'。当偏移量为零时,输出将为“+0000”。四个字母输出完整形式的局部偏移,相当于Offset-O的四个字母。如果偏移为零,则输出将是相应的本地化偏移文本。五个字母输出小时,分钟,可选第二个,如果非零,则使用冒号。如果偏移量为零,则输出“Z”。六个或更多字母抛出IllegalArgumentException。

你需要5个Z.

String format = "yyyy-MM-dd HH:mm:ss ZZZZZ";

Demo


3
投票

您不需要使用格式模式字符串。

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .appendLiteral(' ')
            .appendOffsetId()
            .toFormatter();
    String timeStampString = "2020-01-31 12:13:14 +03:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(timeStampString, formatter);
    System.out.println(dateTime);

它更啰嗦,但更难弄错。我只是从内置部件组装格式化程序。输出是:

2020-01-31 12:13:14 + 03:00

我也正在解析为OffsetDateTime而不是ZonedDateTime。由于字符串包含偏移量(+03:00)而没有时区(例如America / Boa_Vista),即使它可能适用于ZonedDateTimeOffsetDateTime也是正确使用的类。

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