如何使用DateTimeFormatter用冒号解析偏移量?

时间:2019-04-09 18:50:23

标签: java datetime parsing java-8 dateformatter

我有以下字符串: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中的任何一个支持。

所以问题是如何构造格式化程序字符串以对其进行解析?

3 个答案:

答案 0 :(得分:3)

javadoc

  

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

您需要5个Z

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

Demo

答案 1 :(得分: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

答案 2 :(得分: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-31T12:13:14 + 03:00

我还将解析为OffsetDateTime而不是ZonedDateTime。由于该字符串包含偏移量(+03:00)且没有时区(例如America / Boa_Vista),即使它可能与ZonedDateTime一起使用,所以OffsetDateTime是要使用的正确类。