繁体   English   中英

ZonedDateTime 格式和格式模式中带有“z”的解析异常

[英]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中),因为UTCjava.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的缩写的LocaleCentral 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而不是hhhh = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM