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

Sew*_*zki 5 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 );
Run Code Online (Sandbox Code Playgroud)

其中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",
Run Code Online (Sandbox Code Playgroud)

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

根据 JavaDocs:类 DateTimeFormatter "+03:00" 应受以下任一支持:ZXx

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

Sam*_*ipp 4

您应该使用时间X( yyyy-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);
Run Code Online (Sandbox Code Playgroud)

来自文档

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

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

两个字母输出小时和分钟,不带冒号,例如“+0130”。

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

四个字母输出小时和分钟以及可选的秒,不带冒号,例如“+013015”。

五个字母输出小时和分钟以及可选的秒,带有冒号,例如“+01:30:15”。

六个或更多字母将引发 IllegalArgumentException。

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

您也可以使用五个字母 ( XXXXX),也可以使用ZZZorZZZZZ代替XXXor XXXXX