我有以下字符串: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”应受Z
,X
和x
中的任何一个支持。
所以问题是如何构造格式化程序字符串以对其进行解析?
答案 0 :(得分:3)
Offset Z (偏移Z):这会根据图案数量设置偏移格式 字母。一,二或三个字母输出小时和分钟, 没有冒号,例如'+0130'。当 偏移量为零。四个字母输出完整的本地化形式 offset,相当于Offset-O的四个字母。输出将是 如果偏移量为零,则对应的本地化偏移量文本。 五 字母输出小时,分钟,如果非零,则输出可选的秒, 。如果偏移量为零,则输出“ Z”。六个或更多字母 抛出IllegalArgumentException。
您需要5个Z
String format = "yyyy-MM-dd HH:mm:ss ZZZZZ";
答案 1 :(得分:3)
您应该使用时间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);
来自docs:
偏移X和x:这将根据图案字母的数量来格式化偏移。
一个字母仅输出小时,例如“ +01”,除非分钟非零,在这种情况下,分钟也会输出,例如“ +0130”。
两个字母输出小时和分钟,不带冒号,例如'+0130'。
三个字母输出小时和分钟,并带有冒号,例如'+01:30'。
四个字母输出小时和分钟,可选秒,不带冒号,例如'+013015'。
五个字母输出时,分和可选秒,并带有冒号,例如'+01:30:15'。
六个或更多字母会引发IllegalArgumentException。
当要输出的偏移量为零时,模式字母“ X”(大写)将输出“ Z”,而模式字母“ x”(小写)将输出“ +00”,“ + 0000”或“ +00:00”。
或者,您可以使用五个字母(XXXXX
),也可以使用ZZZ
或ZZZZZ
代替XXX
或XXXXX
。
答案 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
是要使用的正确类。