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

ada*_*key 3 java formatting parsing date java-time

DateTimeFormatter当您尝试超出可能范围的日期时,Java 会抛出异常,例如:

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

将抛出:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

ass*_*ias 5

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

import static java.time.format.ResolverStyle.STRICT;

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uuuu").withResolverStyle(STRICT);
Run Code Online (Sandbox Code Playgroud)

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

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