在使用 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);
|
与原代码对比,增加默认值设置,默认为某个月的第一天。