我有以下格式化程序:
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())
它应该可以工作。
关于java - DateTimeFormatterBuilder 与 YEAR 字段的指定 parseDefaulting 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38307816/