LocalDate正在默默地纠正不良日期?

时间:2019-05-07 19:53:37

标签: java java-date

我希望来自以下方面的例外情况:

LocalDate.parse("9/31/2018",DateTimeFormatter.ofPattern("M/d/yyyy"));

但是我得到了2018年9月30日!?别误会我的意思,它很聪明很不错,但是我已经期望Java的Date类的精度会更高……

有人可以阐明如何/为什么吗?这会弄乱我的测试。

1 个答案:

答案 0 :(得分:8)

这是由于格式化程序使用ResolverStyle来解析值。默认情况下(至少在我的计算机上)它是“智能”:

  

例如,使用智能模式在ISO日历系统中解析年月和月日,将确保月日从1到31,将超出最后一个有效日期的任何值转换为月份为最后一个有效的月份。

...但是您可以将其设置为“严格”,在这种情况下,解析将失败。完整的示例(使用u而不是y以避免未指定时代的歧义):

import java.time.*;
import java.time.format.*;

public class Test {

    public static void main (String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/uuuu");
        // With the "smart" resolver style, it parses
        System.out.println(formatter.getResolverStyle());
        LocalDate date = LocalDate.parse("9/31/2018", formatter);
        System.out.println(date);

        // But with a strict style...
        formatter = formatter.withResolverStyle(ResolverStyle.STRICT);
        LocalDate.parse("9/31/2018", formatter);
    }
}