You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DateTimeFormatter解析日期报错,SimpleDateFormat却正常,求解决

解析日期字符串时DateTimeParseException的原因与解决办法

嗨,我来帮你搞明白这个问题!你遇到的这个异常,核心原因是Java 8新日期API和旧的SimpleDateFormat在解析严格性上的本质区别。

为什么会报错?

DateTimeFormatter默认是严格解析模式的,你写的格式串yyyy-MM-dd HH:mm:ss.SSS明确要求毫秒部分必须是三位数字,但你的输入字符串是2018-05-16 03:39:13.0——小数点后只有一位数字。当解析到索引20的位置(也就是.0之后),找不到剩下的两位毫秒数,自然就抛出DateTimeParseException了。

而旧的SimpleDateFormat是出了名的“宽松”,它会自动把不足三位的毫秒数补零,比如.0会被它当作.000处理,所以不会报错。

怎么解决?

这里给你三个实用的方案,你可以根据自己的场景选择:

方案1:修改格式匹配规则

把格式串里的SSS改成S,因为S可以匹配1到任意位数的毫秒数,完美适配你的输入:

String date = "2018-05-16 03:39:13.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
LocalDateTime localDate = LocalDateTime.parse(date, formatter);

方案2:开启宽松解析模式

如果你不想改格式串,可以用DateTimeFormatterBuilder来设置宽松解析,让它自动补全缺失的毫秒位:

String date = "2018-05-16 03:39:13.0";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd HH:mm:ss.SSS")
        .parseLenient() // 开启宽松解析
        .toFormatter();
LocalDateTime localDate = LocalDateTime.parse(date, formatter);

方案3:预处理输入字符串

如果前两种都不符合你的需求,还可以先把字符串里的.0替换成.000,保证毫秒部分是三位:

String date = "2018-05-16 03:39:13.0";
// 把小数点后只有一位的情况补成三位
date = date.replaceAll("\\.(\\d)$", ".$100");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime localDate = LocalDateTime.parse(date, formatter);

小提醒

其实DateTimeFormatter的严格性是个优点,它能避免很多旧API里的歧义问题,比如不同格式的日期被错误解析。所以优先考虑前两种方案会更稳妥哦~

内容的提问来源于stack exchange,提问作者Arnab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:21