[英]ZonedDateTime format and parsing exception with “z” in format pattern
我在解析ZonedDateTime
时遇到问题:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-ddzhh:mm");
ZonedDateTime.parse(s, formatter);
这会导致错误:
java.time.format.DateTimeParseException:
Text '2022-05-24UTC12:15' could not be parsed at index 10
这段代码有什么问题?
字符z
应该能够解析"UTC"
(在大多数Locale
中),因为UTC在java.time
中被视为时区 ID和时区名称。 VV
可以解析时区 ID ,而z
可以根据java.time.DateTimeFormatter
的 JavaDocs解析时区名称,这是文档的相关部分:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
(…)
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
(…)
这意味着您可以使用字符V
对其进行解析,而无需为DateTimeFormatter
提供特定的Locale
。 您将必须放置其中两个( VV
),否则您将收到带有以下消息的漂亮IllegalArgumentException
:
java.lang.IllegalArgumentException: Pattern letter count must be 2: V
如果您仍想使用z
,请提供一个将UTC
视为Universal Time Coordinated的缩写的Locale
, Central European Summer Time是一个在不同Locale
之间肯定会发生变化的缩写,例如
CEST
MESZ
其他Locale
可能有不同的缩写,这让我想知道您的Locale
是否真的有不同的UTC
缩写。
例如,提供Locale.ENGLISH
,它应该可以成功解析。
无论如何,您都应该提供一个,因为如果您不这样做, DateTimeFormatter
将隐式使用您的(Java 虚拟)机器的默认Locale
。
所以你可以试试这个:
DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-ddVVHH:mm");
或这个:
DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-ddzHH:mm", Locale.ENGLISH);
如果一天中的几个小时使用HH
而不是hh
( hh
= 12h 格式, HH
= 24h 格式),两者都应该能够解析像"2022-05-24UTC12:15"
这样的输入。
是的,这是因为格式化程序模式,我建议使用下面的代码:
final DateTimeFormatter format
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime
.parse("2022-05-24 14:30:30 -01:00", format);
System.out.println(zonedDateTime);
ZonedDateTime localTimeline = zonedDateTime
.withZoneSameInstant(ZoneId.systemDefault());
// for the local timezone
System.out.println(localTimeline);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.