LocalDate.parse 是否默默地更正日期数字?

Dan*_*iel 4 java date datetime-format localdate

String s = "2020 Jun 31";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MMM dd");
LocalDate date = LocalDate.parse(s, formatter);
System.out.println(date);
Run Code Online (Sandbox Code Playgroud)

输出:

2020-06-30

为什么 31 会变成 30 而没有任何警告或异常?

Jon*_*oni 5

DateTimeFormatter 有一个ResolverStyle,它会影响解析器对无效日期和时间值的严格程度或宽松程度。要在这种情况下获得异常,您需要将解析器样式设置为 STRICT。

您还需要在格式字符串中使用u(year) 而不是(year-of-era)。y

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu MMM dd")
                                  .withResolverStyle(ResolverStyle.STRICT);
Run Code Online (Sandbox Code Playgroud)

默认解析器类型是SMART

使用智能解析将为每个字段执行合理的默认值,这可能与严格相同,与宽松相同,或第三种行为。各个领域对此会有不同的解释。

例如,使用智能模式解析ISO日历系统中的年-月和日将确保月份的日期是从1到31,将最后一个有效日期之外的任何值转换为该月的最后一个有效日期。