我有以下字符串: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
。
那么问题是如何构造格式化字符串来解析它?
你应该使用时间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
。
您不需要使用格式模式字符串。
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),即使它可能适用于ZonedDateTime
,OffsetDateTime
也是正确使用的类。