无法将字符串转换为 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 及更高版本上,从 hh
到 HH
的更改是问题中的代码正常工作所需要的。
链接
- Java 错误数据库中的错误 DateTimeFormatter won't parse dates with custom format "yyyyMMddHHmmssSSS"
- 关于错误的问题Is java.time failing to parse fraction-of-second?
- 格式模式字符串
中关于hh
的问题Comparing two times in android
我正在尝试将字符串转换为 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 及更高版本上,从 hh
到 HH
的更改是问题中的代码正常工作所需要的。
链接
- Java 错误数据库中的错误 DateTimeFormatter won't parse dates with custom format "yyyyMMddHHmmssSSS"
- 关于错误的问题Is java.time failing to parse fraction-of-second?
- 格式模式字符串 中关于
hh
的问题Comparing two times in android