LocalDateTime.parse 无法解析秒跟毫秒连在一起的字符串是什么原因?

2022-06-07 11:39:45 +08:00
 leeyuzhe
String timeString = "20220601132050399";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime.parse(timeString,format);

这样就报错“java.time.format.DateTimeParseException: Text '20220601132050399' could not be parsed at index 0”。 但是如果随便什么东西把毫秒跟秒隔开就没问题比如:

20220601132050:399 yyyyMMddHHmmss:SSS
20220601132050 399 yyyyMMddHHmmss SSS

就都没问题。请问这是啥原因?

另外正向 format 是没问题的。

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime.now().format(format);
1542 次点击
所在节点    Java
5 条回复
aguesuka
2022-06-07 12:02:55 +08:00
jdk11 和 17 分别测试了第一段代码, 没有复现
chendy
2022-06-07 12:10:01 +08:00
java8 复现,17 无法复现
目测是个 bug……
zhzy0077
2022-06-07 12:26:36 +08:00
https://bugs.openjdk.org/browse/JDK-8031085

不出意外是这个 里面有几个 workaround 楼主可以试试看
yazinnnn
2022-06-07 12:45:23 +08:00
https://blog.csdn.net/kuailebuzhidao/article/details/118465230

csdn 还是有内容的

---------

根据上述分析,只要让代码可以明确知道固定子序列宽度是 10 ,毫秒可变序列宽度是 3 即可。官方提供的方法是单独拼接毫秒并指定宽度。

public class TestDate {
public static void main(String[] args) {
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss")
.appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter();

LocalDateTime datetime = LocalDateTime.parse("20210601140102123", formatter);
System.out.println(datetime);

String formatTime = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(formatTime);
}
}
leeyuzhe
2022-06-07 13:29:27 +08:00
@aguesuka @chendy @zhzy0077 @yazinnnn 感谢各位,确实是 jdk8 的问题,已采用显示的指示毫秒长度来解决。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/857844

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX