1 回答
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
添加回答
举报