无法将字符串转换为 LocalDateTime 对象

Unable to convert string to LocalDateTime object

我正在尝试将字符串转换为 Java8 中的 LocaleDateTime 对象,如下所示:

    DateTimeFormatter globalFormat = DateTimeFormatter.ofPattern("yyyyMMddhhmmssSS");
    String input = "2019082905020425";
    LocalDateTime currentDateTime = LocalDateTime.parse(input, globalFormat);

但是我遇到了异常,如果有人可以帮助我解决同样的问题:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '2019082905020425' could not be parsed at index 0 at
java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)at test.main(Test.java:20)

这是 Java 8.

中的错误

Java 8

的解决方法
    DateTimeFormatter globalFormat = new DateTimeFormatterBuilder()
            .appendPattern("yyyyMMddHHmmss")
            .appendValue(ChronoField.MILLI_OF_SECOND, 3)
            .toFormatter();
    String input = "2019082905020425";
    String adaptedInput = input + "0";
    LocalDateTime currentDateTime = LocalDateTime.parse(adaptedInput, globalFormat);
    System.out.println("Parsed date and time: " + currentDateTime);

此代码段的输出是(在 jdk-1.8.0_121 上测试):

Parsed date and time: 2019-08-29T05:02:04.250

Java 8 无法分隔像 ss 这样的整数字段和像 SS 这样的小数字段,它们之间没有任何分隔符。解决方法是也将分数解析为整数。您的字符串包含 100 秒,并且没有内置整数字段。所以我附加了一个额外的 0(零)以便我们得到毫秒,然后使用 ChronoField.MILLI_OF_SECOND 进行解析。

这是否真的是一个错误也许可以讨论。文档中从来没有严格承诺它应该工作,但这似乎是许多人的期望,无论如何他们在 Java 9.

中修复了它

我又做了一次更正,您需要检查这是否是您想要的更正:小写字母 hh 表示上午或下午从 01 到 12 之间的小时。如果您有意这样做,您需要指定您想要上午还是下午。相反,我假设 05 是一天中从 00 到 23 的一个小时。使用大写 HH 来解析它。

编辑:使用正则表达式? @josejuan 提倡在上面使用正则表达式。这是一个选项,可以让我们完全摆脱显式格式化程序:

    String input = "2019082905020425";
    String adaptedInput = input.replaceFirst(
            "^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$",
            "--T::.");
    LocalDateTime currentDateTime = LocalDateTime.parse(adaptedInput);

结果和之前一样。就我而言,我发现后一种代码更难阅读和维护。此外,一旦您迁移到 Java 9 或更高版本,我认为上面的第一个代码片段更直接地返回到您开始的代码,这正是您最终想要的。选择您喜欢的解决方案。

代码适用于 Java 9 及更高版本

在 Java 9 及更高版本上,从 hhHH 的更改是问题中的代码正常工作所需要的。

链接