我正尝试将字符串转换为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)
答案 0 :(得分:3)
这是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及更高版本上,从hh
到HH
的更改是我们所需要的,以便问题中的代码可以正常工作。
hh
的格式格式字符串中的问题Comparing two times in android