【问题标题】:Is there any rules or importance of order when using multiple optional patterns in DateTimeFormatter在 DateTimeFormatter 中使用多个可选模式时是否有任何规则或顺序的重要性
【发布时间】:2018-03-23 08:50:39
【问题描述】:

下面的代码可以正常工作

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy-MM-dd HH:mm:ss][yyyy-MM-dd]");
System.out.println(LocalDate.parse("1991-01-28", formatter));
System.out.println(LocalDate.parse("1991-01-28 00:00:00", formatter));

但这会引发异常(唯一的区别是模式的顺序

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy-MM-dd HH:mm:ss]");
System.out.println(LocalDate.parse("1991-01-28", formatter));
System.out.println(LocalDate.parse("1991-01-28 00:00:00", formatter));

这是 parseException

Exception in thread "main" java.time.format.DateTimeParseException: Text '1991-01-28 00:00:00' could not be parsed, unparsed text found at index 10

我找不到这种行为的原因。这背后的原因是什么?

我找到了一个可能与我的相似的question,但我不确定这是否是重复的。

【问题讨论】:

  • 您链接到的问题非常相似,我会立即认为您的问题是重复的。由于您不确定,可以公平地说它不是精确重复。

标签: java java-time date-parsing


【解决方案1】:

根据我的经验,经验法则是将较长的格式放在较短的格式之前,就像在您的第一个 sn-p 中一样。你的观察似乎证实了我的规则。并不是说我在任何地方都看到过它的描述,你可能想搜索一下,你可能会找到。

第二种情况发生的是第一个可选模式匹配1991-01-28。剩下的字符串是00:00:00(带有前导空格)。此余数与第二个可选模式不匹配,然后将其跳过。之后您收到的消息

在索引 10 处发现未解析的文本

很好地描述了这种情况。

【讨论】:

  • 嗯,但这是预期的行为吗?找不到任何与可选模式相关的文档。
  • 它可能没有明确记录,但我听说的所有解析都是从一开始就发生在最后,所以如果我们假设这里也是这种情况,我认为它会遵循按顺序尝试可选模式。这是所期望的行为。它不像匹配正则表达式,它回溯。日期时间解析不会这样做。
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2011-05-01
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多