DateTimeFormatterBuilder 与 YEAR 字段的指定 parseDefaulting 冲突

DateTimeFormatterBuilder with specified parseDefaulting conflicts for YEAR field

我有以下格式化程序:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMM")
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear())
        .toFormatter()
        .withZone(ZoneId.systemDefault());

我尝试解析字符串“201505”

System.out.println(ZonedDateTime.parse("201505", formatter));

并抛出异常:

Caused by: java.time.DateTimeException: Conflict found: Year 2016 differs from Year 2015

如果我注释掉 YEAR 的默认值设置就可以了。

据我对文档的理解,如果没有解析值,它应该只尝试替换默认值。似乎这适用于一个月,因为我的月份与解析的默认月份不同。但是,它不适用于一年。

我是不是用错了,有人能告诉我是否有不同的方法来定义模式中可能不存在的字段的默认值吗?

问题是模式字母 "y" 指的是 ChronoField.YEAR_OF_ERA,而不是 ChronoField.YEAR。只需更改最后 parseDefaulting 行:

.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear())

它应该可以工作。