微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java.time.format.DateTimeParseException:无法在索引处解析文本

如何解决java.time.format.DateTimeParseException:无法在索引处解析文本

这看起来很容易实现,但我没有做到。

我有一个字符串模式,它是 yyyyMMddHH,我正在尝试将 2021061104 解析为 LocalDateTime 的实例

代码如下:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;


class Main {
    public static void main(String[] args) {
        String pattern = "yyyyMMddHH";
        String date = "2021061104";
        DateTimeFormatter formatter =
            new DateTimeFormatterBuilder()
                .parseDefaulting(ChronoField.HOUR_OF_DAY,0)
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR,0)
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE,0)
                .parseLenient()
                .appendPattern(pattern)
                .toFormatter();
        LocalDateTime ldt = LocalDateTime.parse(date,formatter);
    }
}

它抛出这个异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2021061104' Could not be parsed at index 8
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.LocalDateTime.parse(LocalDateTime.java:492)
        at Main.main(Main.java:22)

无法解析输入中的 HH 字段。
我看过 javadoc here 但这没有帮助。

为什么我有这个例外?如何解决这个问题?

编辑:

我无法删除 .parseDefaulting(ChronoField.HOUR_OF_DAY,0)

以下是限制条件:

  • 用户将给出 patterndate(可能是 args[0]args[1]
  • 模式必须始终有日期(年月和日期)
  • pattern 中的时间是可选的,最多只能是小时。
  • 几个有效模式的示例是:yyyy-MM-dd HHyyyy MM dd

由于这些限制,我无法删除 .parseDefaulting(ChronoField.HOUR_OF_DAY,0) 因为如果我这样做,我将无法将 yyyy-MM-dd 解析为 LocalDateTime here 的实例>

解决方法

好吧,我认为这是由 .parseDefaulting(ChronoField.HOUR_OF_DAY,0) 行引起的。在进行任何解析之前,构建器会立即插入一个默认值。解析时,小时组件已经有值,所以解析HH失败。

这种行为实际上在the JavaDocs中提到:

在解析过程中,会检查解析的当前状态。如果指定的字段没有关联值,因为在那个时候还没有被成功解析,那么指定的值被注入到解析结果中。注入是即时的,因此字段-值对将对格式化程序中的任何后续元素可见。因此,此方法通常在构建器的末尾调用。

强调我的。

因此,可能的解决方法是将 parseDefaulting 行移动到格式化程序构建器的末尾:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .parseLenient()
    .appendPattern(pattern)
    .parseDefaulting(ChronoField.HOUR_OF_DAY,0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR,0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE,0)
    .toFormatter();

Here is a working example 将这些行移到构建器的末尾。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?