DateTimeFormatter具有指定解析的EYE字段的默认值冲突

2022-09-03 07:04:11

我有以下格式化程序:

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));

它抛出一个异常:

由以下原因引起:java.time.DateTimeException:发现的冲突:2016 年与 2015 年不同

如果我注释掉了 YEAR 的默认值设置,它有效。

据我所知,文档,它应该只在没有解析值的情况下尝试替换默认值。似乎这适用于月份,因为我与解析的默认月份不同。但是,它不适用于一年。

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


答案 1

问题在于模式字母 “y” 指的是 ,而不是 。只需更改最后一行:ChronoField.YEAR_OF_ERAChronoField.YEARparseDefaulting

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

它应该工作。


答案 2