【问题标题】:Java 8 DateTimeFormatter: confusion with 'z' and 'Z ' pattern lettersJava 8 DateTimeFormatter:与“z”和“Z”模式字母混淆
【发布时间】:2016-07-19 11:15:16
【问题描述】:

我有日期字符串“2015-01-12T13:00:00.000+02:00”。 查看 JavaDoc,我看到以下内容:

z       time-zone name              zone-name         Pacific Standard Time; PST
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;


所以我怀疑要解析它,我必须使用大写的“Z”,因为我有 +02:00 中给出的区域格式:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000Z");

但是我得到一个解析错误。

如果我使用小写的“z”,它可以工作:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000z")


有谁知道怎么回事?


代码:

DateTimeFormatter changetimeParser_Z = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000Z");
DateTimeFormatter changetimeParser_z = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000z");

String time = "2015-01-12T13:00:00.000+02:00";

ZonedDateTime time1 = ZonedDateTime.parse(time, changetimeParser_z);
System.out.println(time1);
ZonedDateTime time2 = ZonedDateTime.parse(time, changetimeParser_Z);

System.out.println(time2);


异常堆栈跟踪:

2015-01-12T13:00+02:00
java.time.format.DateTimeParseException: Text '2015-01-12T13:00:00.000+02:00' could not be parsed at index 23
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)

【问题讨论】:

  • 输入是什么?代码是什么?什么是完整的错误堆栈跟踪?
  • 不要在 cmets 中发布。编辑您的问题。
  • 试试X而不是Z
  • 我不使用 X。但它适用于 z,问题是它为什么这样做。

标签: java datetime-format zoneddatetime


【解决方案1】:

我认为这是 Javadoc 中的一个错误,这部分是一个错误

Symbol  Meaning                     Presentation      Examples<br>
------  -------                     ------------      -------
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

因为如果您进一步阅读,您会发现偏移量的解释Z

偏移 Z:这会根据模式字母的数量来格式化偏移。一个、两个或三个字母输出小时和分钟,不带冒号,例如'+0130'。当偏移量为零时,输出将为“+0000”。四个字母输出本地化偏移的完整形式,相当于四个字母的Offset-O。如果偏移量为零,则输出将是相应的本地化偏移量文本。五个字母输出小时、分钟,如果非零,则可选秒,带冒号。如果偏移量为零,则输出“Z”。六个或更多字母会引发 IllegalArgumentException。

符合RFC 822

对我来说,该模式的行为应该与 SimpleDateFormat 相同

【讨论】:

  • 但是我的 z 模式怎么会起作用呢?我在“+02:00”中有区域,但我的 z 格式模式实际上需要一个区域名称 fx ETC/PST 等
  • 啊,由于详细阅读了 Offset Z eplanation,我突然明白了。我必须输入 5 Z,因为我有 +00:00。所以它适用于 DateTimeFormatter changetimeParser_Z = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.000ZZZZZ");
  • '它与单个 z 一起工作的原因一定是因为它在某种程度上是宽松的'并且'猜测'它应该是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2015-08-11
相关资源
最近更新 更多