DateTimeFormatter 自动更正无效(语法上可能)的日历日期
DateTimeFormatter auto-corrects invalid (syntactically possible) calendar date
Java DateTimeFormatter
当您尝试超出可能范围的日期时抛出异常,例如:
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
。我不想要这种行为,我希望它在日期不是有效日历日期时仍然抛出异常。是否有我可以设置的内置选项,或者我真的必须尝试手动筛选这些实例吗?
您可以使用 STRICT
解析器样式:
import static java.time.format.ResolverStyle.STRICT;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uuuu").withResolverStyle(STRICT);
默认情况下,ofPattern
使用 a SMART
resolver style,这将使用合理的默认值。
请注意,我使用 uuuu
而不是 yyyy
,即 YEAR instead of YEAR_OF_ERA。假设您在公历系统中,这两者在当前时代(第 1 年或更大)的年份是等效的。差异在上面的链接中有更详细的解释。
Java DateTimeFormatter
当您尝试超出可能范围的日期时抛出异常,例如:
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
。我不想要这种行为,我希望它在日期不是有效日历日期时仍然抛出异常。是否有我可以设置的内置选项,或者我真的必须尝试手动筛选这些实例吗?
您可以使用 STRICT
解析器样式:
import static java.time.format.ResolverStyle.STRICT;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uuuu").withResolverStyle(STRICT);
默认情况下,ofPattern
使用 a SMART
resolver style,这将使用合理的默认值。
请注意,我使用 uuuu
而不是 yyyy
,即 YEAR instead of YEAR_OF_ERA。假设您在公历系统中,这两者在当前时代(第 1 年或更大)的年份是等效的。差异在上面的链接中有更详细的解释。