为何LocalDate.parse不验证闰年?输入无效日期未抛出异常
问题解答
先看你的代码:
DateTimeFormatter formatters = DateTimeFormatter.ofPattern("uuuu-MM-dd"); endDate = LocalDate.parse(endDateString, formatters);
输入2023-02-31不触发异常的核心原因是DateTimeFormatter默认采用宽松解析模式(ResolverStyle.LENIENT)。这种模式下,解析器不会严格校验日期合法性,而是自动将非法日期调整为最近的合法日期:比如2023年2月只有28天,输入的31日会被转换成3月3日(28天后再加3天)。
如果需要严格校验日期有效性,必须显式将解析器设置为严格模式:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd") .withResolverStyle(ResolverStyle.STRICT); LocalDate endDate = LocalDate.parse("2023-02-31", formatter);
此时再输入非法日期,就会直接抛出DateTimeParseException异常。
另外补充:除了STRICT模式,还有ResolverStyle.SMART模式——它会在合理范围内调整日期,但不会像LENIENT那样过度宽松。比如2023-02-31在SMART模式下会报错(2月最多28天,31明显超出范围),但输入2023-04-31时,会自动调整为2023-04-30(4月的最后一天)。
内容的提问来源于stack exchange,提问作者Mazin Ismail
相关产品推荐
相关产品推荐

