需求描述

使用 LocalDate 解析 yyyy-MM 格式的字符串时异常:

1
2
3
4
5
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {Year=2021, MonthOfYear=1},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
4
5
6
7
8
9
10
11
public static void main(String[] args) {
// ① 调整 DateTimeFormatter
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM")
// 添加默认日期
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.toFormatter();
// ② 使用 YearMonth 转换
YearMonth yearMonth = YearMonth.parse("2021-01", fmt);
LocalDate localDate = yearMonth.atEndOfMonth();
}

评论