DateTimeFormatter parseBest() 给出“无法在索引 8 处解析”异常

Posted

技术标签:

【中文标题】DateTimeFormatter parseBest() 给出“无法在索引 8 处解析”异常【英文标题】:DateTimeFormatter parseBest() gives ' could not be parsed at index 8' exception 【发布时间】:2016-12-07 10:54:16 【问题描述】:

我对 parseBest 方法的工作原理有点困惑。 我有一个格式化程序模式,我正在使用 parseBest 方法解析日期,如下所示:

    DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd['T'HH:mm:ss[Z]]");
    parseMyDate(parser, "2016-12-07");
    parseMyDate(parser, "2016-12-07T15:31:12");
    parseMyDate(parser, "2016-12-07T15:31:12-0500");
    parseMyDate(parser, "2016-12-07Hello");

    public static void parseMyDate(DateTimeFormatter formatter, String parseText) 
    try 
      TemporalAccessor ta = formatter.parseBest(parseText, 
                                                OffsetDateTime::from,
                                                LocalDateTime::from, 
                                                LocalDate::from);
      if (ta instanceof OffsetDateTime) 
        OffsetDateTime odt = OffsetDateTime.from(ta);
        System.out.println("OffsetDateTime: " + odt);
       else if (ta instanceof LocalDateTime) 
        LocalDateTime ldt = LocalDateTime.from(ta);
        System.out.println("LocalDateTime: " + ldt);
       else if (ta instanceof LocalDate) 
        LocalDate ld = LocalDate.from(ta);
        System.out.println("LocalDate: " + ld);
       else 
        System.out.println("Parsing returned: " + ta);
      
     catch (DateTimeParseException e) 
      System.out.println("Here in Exception : "+e.getMessage());
      //e.printStackTrace();
    
  

但是对于所有方法调用,我得到了相同的异常如下:

java.time.format.DateTimeParseException:无法在索引 8 处解析文本“2016-12-07Hello” 在 java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 在 java.time.format.DateTimeFormatter.parseBest(DateTimeFormatter.java:1897) 在 com.my.j8.DataTime.parseStr(DataTime.java:164) 在 com.my.j8.DataTime.main(DataTime.java:158)

我尝试按如下方式更改模式: DateTimeFormatter 解析器 = DateTimeFormatter.ofPattern("yyyy-MM- dd");

但仍然没有运气。有什么建议吗?

【问题讨论】:

除了被否决,不要删除问题,因为这段代码可能会帮助某人做一些好的/最好的解析练习。 【参考方案1】:

您的模式中 -dd 之前有一个空格,因此您的所有日期都与该模式不匹配 - 匹配必须准确。

"yyyy-MM-dd['T'HH:mm:ss[Z]]"(没有空格)的模式适用于您的前 3 个模式。

最后一个模式仍然失败,因为该模式不匹配 Hello - 该模式必须匹配整个输入字符串。

【讨论】:

以上是关于DateTimeFormatter parseBest() 给出“无法在索引 8 处解析”异常的主要内容,如果未能解决你的问题,请参考以下文章

Spark 和不可序列化的 DateTimeFormatter

DateTimeFormatter 为边缘情况提供错误格式[重复]

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!

如何使用 jsr310 DateTimeFormatter 解析不区分大小写的字符串?

Java8- ZonedDateTime 与 DateTimeFormatter 无法识别格式