Java 8 时间解析的bug:java.time.format.DateTimeParseException: Text '20180225142051591' could not be parsed at index 0

Java 8的DateTimeFormatter在解析含有毫秒的时间字符串为LocalDateTime有bug,如下:

String x = "20180225142051591"; 
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime t1 = LocalDateTime.parse(x, dtf); 

抛出异常如下:

java.time.format.DateTimeParseException: Text '20180225142051591' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at java.time.LocalDateTime.parse(LocalDateTime.java:477)

这个是Java 8的一个bug:https://bugs.openjdk.java.net/browse/JDK-8031085

替代的解决方案

一个替代的解决方案是使用java.time.format.DateTimeFormatterBuilder结合java.time.temporal.ChronoField来处理毫秒或者纳秒。

String text = "20180225142051591";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// 解析date+time
.appendPattern("yyyyMMddHHmmss")
// 解析毫秒数
.appendValue(ChronoField.MILLI_OF_SECOND, 3)
.toFormatter();
formatter.parse(text);

版权声明:著作权归作者所有。

相关推荐

Java 9 Stream新增方法takeWhile的bug

Java 9的Stream新增方法takeWile():允许我们返回Stream里满足条件的前面部分元素。如:String[] arr= {"a", "b", "c","d"}; Arrays.stream(arr)     &n

Java 8双冒号::方法引用操作符

Java 8中,双冒号::称为方法引用操作符,我们可以使用它来引用类的方法。::引用类的方法,返回一个函数接口(function interface),这等同于lambda表达式,但与lambda表达式不同的是,lambda表达式需要自定义一个lambda body,而::引用的是一个方法。简单地说函数接口,就是只拥有一个抽象方法的接口,如Runnable。::引用方

Android Studio 3内置支持Java 8的相关配置

Android Studio 3开始支持Java 7全部的特性,以及内置支持Java 8部分特性。原理Android Studio 3支持Java 8做法是使用称为desugar工具把javac编译后的.class做字节转换,转换为新的.class文件,最后使用dex转换为dex文件。配置Android Studio&

Java使用System.nanoTime()统计代码运行时间

我们在统计代码的运行时间常常会用System.currentTimeMillis(),如下:long startTime = System.currentTimeMillis(); doReallyLongThing(); long endTime = System.currentTimeMillis(); System.out.p

Java 8 Stream API转换到Kotlin集合API

Kotlin提供的集合操作的API相对Java 8 Stream的API简洁很多。下面是Java 8 Stream API转换到Kotlin集合API。 映射属性聚合为列表// Java:   List<String> names = users.stream().m