DateTimeFormatter自动更正无效(语法上可能)的日历日期

当您尝试超出可能范围的日期时,Java DateTimeFormatter会引发exception,例如:

 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/yyyy"); String dateString = "12/32/2015"; LocalDate ld = LocalDate.parse(dateString, dtf); 

将抛出:

 Exception in thread "main" java.time.format.DateTimeParseException: Text '12/32/2015' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32 

但是当我输入一个无效的日历日期时,它的标准在语法上仍然可行,它会将其自动更正为有效日期,例如:

 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/yyyy"); String dateString = "2/31/2015"; LocalDate ld = LocalDate.parse(dateString, dtf); 

它成功解析但自动更正到2015-02-28 。 我不希望这种行为,我希望它在日期不是有效的日历日期时仍然抛出exception。 是否有可以为此设置的内置选项,或者我是否真的必须尝试手动筛选出这些实例?

您可以使用STRICT解析器样式:

 import static java.time.format.ResolverStyle.STRICT; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uuuu").withResolverStyle(STRICT); 

默认情况下, ofPattern使用SMART解析器样式 ,该样式将使用合理的默认值。

请注意,我使用的是uuuu而不是yyyy ,即YEAR而不是YEAR_OF_ERA 。 假设您处于公历系统中,这两者在当前时代(第1年或更高年级)相当多年。 在上面的链接中更详细地解释了这种差异。