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

时间:2015-12-03 09:06:17

标签: java java-8 java-time

当我使用func +=(inout l: String!, r: String) { l = (l ?? "") + r } var a: String! = "a" var b: String = "b" a += b // "ab" 时,它可以解析。

SimpleDateFormat

但是当我使用Java 8 SimpleDateFormat format = new SimpleDateFormat("yyyyMM"); format.setLenient(false); Date d = format.parse(date); 时,

DateTimeFormatter

它抛出

  

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

日期的字符串值为DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM"); LocalDate localDate = LocalDate.parse(date, formatter);

2 个答案:

答案 0 :(得分:11)

问自己一个问题:哪一天应该用字符串"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);

答案 1 :(得分:3)

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

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

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