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

时间:2019-09-14 07:24:24

标签: java datetime-parsing java.time

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

    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)

1 个答案:

答案 0 :(得分:3)

这是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上测试):

  

分析日期和时间:2019-08-29T05:02:04.250

Java 8无法分隔ss之类的整数字段和SS之类的小数字段,而它们之间没有任何分隔符。解决方法是也将分数解析为整数。您的字符串包括百分之一秒,并且没有内置整数字段。因此,我附加了一个额外的0(零),以便获得毫秒数,然后使用ChronoField.MILLI_OF_SECOND进行解析。 / p>

是否真的是一个错误,可以争论。在文档中从来没有任何严格的承诺可以使用它,但是这似乎是许多人的期望,无论如何,他们在Java 9中对其进行了修复。

我已经进行了一次更正,您将需要检查是否是所需的更正:小写hh是从01到12的AM或PM中的一个小时。如果您打算这样做,则需要指定您要AM还是PM。相反,我认为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})$",
            "$1-$2-$3T$4:$5:$6.$7");
    LocalDateTime currentDateTime = LocalDateTime.parse(adaptedInput);

结果与以前相同。就我而言,我发现后者的代码很难阅读和维护。同样,当您迁移到Java 9或更高版本时,我认为上面的第一个代码片段更适合直接回到您从其开始的代码,这正是您最终想要的。选择您喜欢的解决方案。

代码在Java 9和更高版本上正常工作

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

链接