为什么我的模式(“yyyyMM”)不能用DateTimeFormatter(java 8)解析

2022-09-04 06:40:08

当我使用时,它可以解析。SimpleDateFormat

SimpleDateFormat format = new SimpleDateFormat("yyyyMM");
format.setLenient(false);
Date d = format.parse(date);

但是当我使用Java 8时,DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
LocalDate localDate = LocalDate.parse(date, formatter);

它抛出

java.time.format.DateTimeParseException: 无法解析文本 '201510': 无法从 TemporalAccessor 获取 LocalDate: {Year=2015, MonthOfYear=10},JAVA .time.format.Parsed 类型的 ISO

日期的字符串值为 。"201510"


答案 1

问问自己一个问题:哪一天应该用字符串解析?A 需要一天,但由于日期中没有要解析的日期,因此无法构造 的实例。"201510"LocalDateLocalDate

如果您只想解析一年和一个月,则可以改用 YearMonth 对象:

YearMonth localDate = YearMonth.parse(date, formatter);

但是,如果您真的希望从此字符串中解析 ,则可以构建自己的字符串,以便它使用该月的第一天作为默认值:LocalDateDateTimeFormatter

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                .appendPattern("yyyyMM")
                                .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                                .toFormatter();
LocalDate localDate = LocalDate.parse(date, formatter);

答案 2

您可以使用 a 并指定所需的日期(例如,说出第一天):YearMonth

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
LocalDate localDate = YearMonth.parse(date, formatter).atDay(1);

或者,如果日期无关紧要,只需使用 .YearMonth


推荐