DateTimeFormatter的DateTimeParseException,其模式为“ yyyy [-MM [-d [HH [:mm [:ss [.SSS]]]]]]“

时间:2018-08-15 14:54:00

标签: java datetime-format

我想创建一个DateTimeFormatter,它接受不同类型的格式,例如:“ 2018”,“ 2018-01-02”或“ 2018-01-02 10:15”。我试图这样构建它:

DateTimeFormatter f1 = new DateTimeFormatterBuilder()
            .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]")
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
            .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
            .toFormatter();

LocalDateTime.parse("2018-01", f1); // no problem
LocalDateTime.parse("2018", f1);    // exception

第二行给出以下异常:

java.time.format.DateTimeParseException: Text '2018' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {Year=2018},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)

此格式化程序将适用于我的所有情况,但简单的“ 2018”除外。谁能告诉我为什么?

奇怪的是,下一个代码块的格式化程序将接受“ 2018”:

DateTimeFormatter f2 = new DateTimeFormatterBuilder()
        .appendPattern("yyyy[-MM[-d]]")
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .toFormatter();

LocalDate.parse("2018", f2);        // no problem

1 个答案:

答案 0 :(得分:4)

我认为您只是使用了不匹配的方括号。

我尝试了您的原始示例:

DateTimeFormatter f1 = new DateTimeFormatterBuilder()
    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]")
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
    .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
    .toFormatter();

并获得与您相同的例外,但是当我再添加一个]时,它会按预期工作,因此对我来说有效:

DateTimeFormatter f1 = new DateTimeFormatterBuilder()
    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]]")
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
    .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
    .toFormatter();

为了帮助比较:

    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]") // throws exception
    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]]") // works fine