具有可选部分的DateTimeFormater

时间:2015-07-27 04:58:43

标签: java datetime-format

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

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

  

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:无法在索引0处解析文本“190001011440”      at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)      在java.time.format.DateTimeFormatter.parseBest(DateTimeFormatter.java:1895)

1 个答案:

答案 0 :(得分:4)

问题似乎是模式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();