java8 DateTimeFormatter不支持yyyyMMddHHmmssSSS格式时间解析解决方法

如题。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格式化为毫秒字符串(不含任何分隔符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值