Ive*_*eva 10 java datetime java-8 java-time
我有以下格式化程序:
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());
Run Code Online (Sandbox Code Playgroud)
我试着解析字符串"201505"
System.out.println(ZonedDateTime.parse("201505", formatter));
Run Code Online (Sandbox Code Playgroud)
它会引发异常:
引起:java.time.DateTimeException:发现冲突:2016年与2015年不同
如果我注释掉YEAR的默认值设置,它会起作用.
据我所知,如果没有解析值,它应该只尝试替换默认值.这似乎适用于月份,因为我的月份与解析的默认月份不同.但它不适用于一年.
我使用它错了可能有人告诉我是否有不同的方法来定义模式中可能不存在的字段的默认值?
Jod*_*hen 11
问题是模式字母"y"指的是ChronoField.YEAR_OF_ERA,而不是ChronoField.YEAR.只需更改最后parseDefaulting一行:
.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear())
Run Code Online (Sandbox Code Playgroud)
它应该工作.