为什么我的模式(“yyyyMM”)无法使用DateTimeFormatter进行解析(java 8)

当我使用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"

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

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

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

但是,如果您确实希望从此String中解析LocalDate ,则可以构建自己的DateTimeFormatter以便它将该月的第一天用作默认值:

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

您可以使用YearMonth并指定所需的日期(比如说第一个):

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

或者如果这一天无关紧要,只需使用YearMonth