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年或更高年级)相当多年。 在上面的链接中更详细地解释了这种差异。