Java 在DateTimeFormatter中使用多个可选模式时,是否有规则或顺序的重要性

Java 在DateTimeFormatter中使用多个可选模式时,是否有规则或顺序的重要性,java,java-time,date-parsing,Java,Java Time,Date Parsing,下面的代码工作正常 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 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));
但这会引发一个异常(唯一的区别是模式的顺序)

这里是parseException

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));
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
我找不到这种行为的原因。这背后的原因是什么


我发现了一个可能与我的相似的格式,但我不确定这是否是重复的。

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

在第二种情况下,第一个可选模式匹配
1991-01-28
。剩下的字符串是
00:00:00
(带前导空格)。此余数与第二个可选模式不匹配,将跳过该模式。在那之后,你得到的信息

在索引10处找到未分析的文本


很好地描述了这种情况。

你链接的问题很相似,我会立即考虑你的副本。既然你不确定,可以公平地说,这不是一个完全相同的行为。嗯,但这是预期的行为吗?找不到任何与可选模式相关的文档。它可能没有明确的文档,但我所听到的所有解析都是从开始到结束进行的,因此如果我们假设这里也是这样,我想接下来会按顺序尝试可选模式。这是我所期望的行为。它不同于匹配的正则表达式,后者是回溯的。日期时间分析不能做到这一点。