在使用 Java8 的时间相关 API 实现字符串转日期类型时,发现会报错。

代码如下:

1
LocalDate d1 = LocalDate.parse("201109", DateTimeFormatter.ofPattern("yyyyMM"));

错误信息为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Exception in thread "main" java.time.format.DateTimeParseException: Text '201101' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=1, Year=2011},ISO of type java.time.format.Parsed
	at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
	at java.time.LocalDate.parse(LocalDate.java:400)
	at Test11.main(Test11.java:23)
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=1, Year=2011},ISO of type java.time.format.Parsed
	at java.time.LocalDate.from(LocalDate.java:368)
	at java.time.format.Parsed.query(Parsed.java:226)
	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
	... 2 more

经搜索后得知原因为:格式化字符串中由于没有到具体天,但 LocalDate 类型又必须精确到天,这就导致解析程序不知道应该解析为某个月的哪一天,最终抛出了报错。

修改方式为:

1
2
3
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyyMM")
                .parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter();
LocalDate d1 = LocalDate.parse("201109", formatter);

与原代码对比,增加默认值设置,默认为某个月的第一天。