如题。java8中,如果使用以下代
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
LocalDateTime dateTime = LocalDateTime.parse("20240627235959999", formatter);
将会抛出异常
java.time.format.DateTimeParseException:
Text '20240627235959999' could not be parsed at index 0
该问题只存在于字符串解析成时间,如果是对一个LocalDateTime变量执行
LocalDateTime.format(formatter)
调用则没有问题
格式在毫秒SSS之前存在小数点则可以正常解析。(本地测试输入其他字符也可以)如格式yyyyMMddHHmmss.SSS 和 输入 20240627235959.999
似乎是和DateTimeFormatter 中大写S字母其实代表秒的分数(fraction),长度是可变的有关。
该问题最终被定义为一个bug。在jdk9中修复
参见 bug - DateTimeFormatter won’t parse dates with custom format “yyyyMMddHHmmssSSS”
三种解决方法:
1.升级到jdk9或以上
2.毫秒前使用带小数点的格式,或者使用含纳秒(n)的格式。但注意,毫秒999代表的是999000000纳秒(9位数)而不是 000000999(9位数)纳秒
3.使用如下语句创建pattern
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
.appendPattern("yyyyMMddHHmmss");
builder.appendValue(ChronoField.MILLI_OF_SECOND, 3);
DateTimeFormatter dtf = builder.toFormatter();
亲测方法3可以正常将时间字符串yyyyMMddHHmmssSSS解析为LocalDateTime,也可以将LocalDateTime格式化为毫秒字符串(不含任何分隔符)