如何强制 java.time.LocalDate 假设 19 世纪为 YY 年份模式?

How to force java.time.LocalDate to assume 19th century as YY year pattern?

以下测试失败:'86 生日的格式为 2068。如何格式化为 1986?

    @Test
    public void testBirthday() {
        assertEquals("1986-08-07", java.time.LocalDate.parse("070886", 
             java.time.format.DateTimeFormatter.ofPattern("ddMMyy")));
    }

失败:

java.lang.AssertionError: expected:<1986-08-07> but was:<2086-08-07>

这与 org.joda.time 库有很大不同,后者会在此处正确假设 19'

/旁注:关于 "duplicate" 问题中的标记答案,我不认为这是重复的!

Java 8 的 LocalDate class 默认使用 2000+ 作为年份。为了解析 1900 及更高版本的 yy 格式,您需要自己减少时间。

当然,即使您对照当前年份检查日期,如果是今天之后减去 100 年,此修复程序对 100 岁以上的人也不起作用。

您也可以使用 yyyy 格式。或者只是使用 Date 对象,如果您愿意,可以将其转换为 LocalDate

可以使用 DateTimeFormatterBuilder.appendValueReduced() 来控制基准年。

此代码将使用 1900 年而不是 2000 年的基准日期进行解析:

DateTimeFormatter f = new DateTimeFormatterBuilder()
  .appendPattern("ddMM")
  .appendValueReduced(ChronoField.YEAR, 2, 2, 1900)
  .toFormatter();
LocalDate date = LocalDate.parse("070886", f);