猿问

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

我正在尝试将字符串转换为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)


慕标5832272
浏览 99回答 1
1回答

精慕HU

这是 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.250Java 8 无法分隔整数字段(如)ss和小数字段(如),SS而它们之间没有任何分隔符。解决方法是将分数也解析为整数。您的字符串包含百分之一秒,并且没有内置整数字段。因此,我附加一个额外的0(零),以便我们得到毫秒,然后用于ChronoField.MILLI_OF_SECOND解析。这是否真的是一个错误可能还有争议。文档中从未严格承诺它应该有效,但这似乎是许多人的期望,无论如何他们在 Java 9 中修复了它。我又进行了一项更正,您需要检查这是否是您想要的更正:小写字母hh表示从 01 点到 12 点之间的 AM 或 PM 内的小时。如果您打算这样做,则需要指定是要 AM 还是 PM。相反,我假设 05 是一天中从 00 到 23 的一个小时。使用大写字母HH来解析它。这是一个选项,可以完全节省我们的显式格式化程序:    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 及更高版本上,我们只需要从hh到进行更改即可使问题中的代码正常工作。HH
随时随地看视频慕课网APP

相关分类

Java
我要回答