带有可选部分的 DateTimeFormatter

DateTimeFormater with optional section

我正在编写一个应用程序来处理文本数据,它将更改输入字符串的内容并根据输入字符串的格式创建新的输出字符串。

我在识别日期时间字符串时遇到了一些问题。根据文档,输入日期时间可能有一些可选部分,这里是示例模式:

yyyy[MM[dd[HHmm]]][Z]

所以在网上进行了一些挖掘之后,我第一次尝试使用 parseBest 函数。

public boolean checkFormatDate(string input){
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy[MM[dd[HHmm]]][Z]");
    try {
        TemporalAccessor temporalAccessor = formatter.parseBest(input, ZonedDateTime::from, LocalDateTime::from, LocalDate::from);
        return true;
    } catch (Exception e) {
        return false;
    }
}

但是上面的代码在这些情况下失败了:

1900 190001 190001011440

我怀疑解析 parseBest 方法的查询不正确。 谁能帮我解决这个问题。

编辑:

这是异常日志:

java.time.format.DateTimeParseException: Text '190001011440' could not be parsed at index 0 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) at java.time.format.DateTimeFormatter.parseBest(DateTimeFormatter.java:1895)

问题似乎出在模式 yyyy 上,它正在创建一个格式化程序,如下所示 (System.out.println(formatter)):

Value(YearOfEra,4,19,EXCEEDS_PAD)[Value(MonthOfYear,2)[Value(DayOfMonth,2)[Value(HourOfDay,2)Value(MinuteOfHour,2)]]][Offset(+HHMM,'+0000')]

注意第一部分中的 4,19 - 最小宽度为 4,最大宽度为 19。按如下方式构建格式化程序,它应该可以工作:

    DateTimeFormatterBuilder b = new DateTimeFormatterBuilder();
    formatter = b.appendValue(ChronoField.YEAR_OF_ERA, 4, 4, SignStyle.EXCEEDS_PAD).appendPattern("[MM[dd[HHmm]]][Z]").toFormatter();