我有以下格式化程序:

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

并引发异常:



如果我注释掉YEAR的默认值设置,它将起作用。

据我了解的文档,它应该仅尝试在未解析任何值的情况下替换默认值。似乎这样适用于月份,因为我的月份与解析的默认月份不同。但是它一年都不起作用。

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

最佳答案

问题在于模式字母“y”是指ChronoField.YEAR_OF_ERA而不是ChronoField.YEAR。只需更改最后parseDefaulting行:

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

它应该工作。

08-04 08:29