为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2023-07-28 15:20:40
我正在尝试将字符串转换为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 atjava.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 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

这是 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解析。


这是否真的是一个错误可能还有争议。文档中从未严格承诺它应该有效,但这似乎是许多人的期望,无论如何他们在 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


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信