【问题标题】:how to parse OffsetTime for format HHmmssZ如何解析格式 HHmmssZ 的 OffsetTime
【发布时间】:2020-04-29 12:49:14
【问题描述】:

我正在尝试解析格式为“HHmmssZ”的日期字符串,

OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssZ")).toLocalTime()

当我测试它时,我得到了异常:

java.time.format.DateTimeParseException: Text '112322Z' could not be parsed at index 6

    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.OffsetTime.parse(OffsetTime.java:327)

【问题讨论】:

  • 文本 112322 最后缺少所需的Z
  • 与 z 相同,无需对此投反对票:(
  • 如果您阅读文档,即DateTimeFormatter 的javadoc,它会说:“偏移量Z:这会根据模式字母的数量来格式化偏移量。一,两个或三个字母输出小时和分钟,不带冒号,例如'+0130'。当偏移量为零时,输出将是'+0000'。" --- 格式字符串中的单字母 Z 无法理解输入中的 Z。您的格式字符串需要ZZZZZXXXXXXXXXXXXXX 才能匹配Z 字母。
  • 仅供参考: 如果错误文本与您显示的代码匹配,那就太好了。最初的问题被否决了,因为显示的错误非常明显,使得该问题对其他人完全无用。已删除反对票。
  • 这能回答你的问题吗? Parse Date String in Java [duplicate]。和/或这个? ZonedDateTime ignores 00 for ss part.

标签: java datetime-format localtime


【解决方案1】:

使用模式字母大写 X 作为偏移量,可以使用 Z 作为零

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssXXX");
    OffsetTime time = OffsetTime.parse("115601Z", timeFormatter);
    System.out.println(time);

这个 sn-p 的输出是:

11:56:01Z

要转换为LocalTime,只需使用.toLocalTime(),就像你已经在做的那样。

对于模式字母Z,偏移量为+0000

编辑:正如你在评论中提到的,修复这种情况的相反方法是保留格式模式字符串并解析与所需格式匹配的字符串:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssZ");
    OffsetTime time = OffsetTime.parse("115601+0000", timeFormatter);

结果和以前一样。格式模式字符串中的一个大写字母Z 匹配(引用文档):

…小时和分钟,不带冒号,例如'+0130'。

链接

Documentaion of DateTimeFormatter 和模式字母。

【讨论】:

  • 谢谢,我宁愿不改变格式,而是使用 115601+0000。
【解决方案2】:

以下所有内容都将返回一个LocalTime,其值为11:56:01

LocalTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmss'Z'"))
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssZZZZZ")).toLocalTime()

【讨论】:

  • 硬编码Z 作为文字,'Z',强烈建议不要给出正确的结果,因为您直接解析为LocalTime,因此不需要解析偏移量。所有其他行都很好。
  • @OleV.V.我不同意。如果输入预期以Z 结尾并且它应该作为本地 时间处理,那么使用强制Z 结尾的格式化程序是正确的选择。否则,115601+01:00115601-05:00 之类的输入也将被处理为 本地 时间 11:56:01,即使它们代表完全不同的 实际 时间。如果输入可以有Z 以外的偏移量,这是什么意思?应该像代码一样忽略偏移量,还是应该在使用之前将时间调整为 UTC?如果忽略,为什么会有偏移量?
  • 我完全可以接受这种分歧。就我而言,为了验证字符串是否为 UTC(由 Z 表示),我将解析为 OffsetTime 并检查 myOffsetTIme.getOffset.equals(ZONeOFfset.UTC)
  • @OleV.V.但是,如果您只知道时间字符串应该以Z 结尾,那么您会选择其他 6 种格式中的哪一种?它们不支持相同的偏移量语法,因此最好使用硬'Z' 使它们全部失败,而不是一些因语法错误而失败,而另一些因自定义 Java 代码的不同消息而失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多