>我有以下格式化程序:
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.DateTime异常:发现冲突:2016 年 与2015年不同
如果我注释掉 YEAR 的默认值设置,它可以工作。
据我了解文档,它应该只在没有解析值的情况下尝试替换默认值。似乎这适用于一个月,因为我的月份与解析的默认月份不同。但是,它一年不起作用。
我用错了吗,有人可以告诉我是否有不同的方法来为模式中可能不存在的字段定义默认值?
问题是模式字母"y"指的是ChronoField.YEAR_OF_ERA
,而不是ChronoField.YEAR
。只需更改最后parseDefaulting
行:
.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear())
它应该有效。