Java 模式为“的DateTimeFormatter的DateTimeParseException;yyyy[-MM[-d[HH[:MM[:ss[.SSS]]][;

Java 模式为“的DateTimeFormatter的DateTimeParseException;yyyy[-MM[-d[HH[:MM[:ss[.SSS]]][;,java,datetime-format,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.MIN

我想创建一个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 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

但是文档对此有点奇怪-它声明可选部分以
optionalEnd()
]
)或构建程序的结尾结束。文档缺陷如何与
optionalEnd()
parseDefault()
的顺序相关-在最末端有
optionalEnd()
,在
parseDefault
之后,阻止解析器正确识别它(参见前面的注释)
    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]") // throws exception
    .appendPattern("yyyy[-MM[-d[ HH[:mm[:ss[.SSS]]]]]]") // works fine