使用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
相关产品推荐
相关产品推荐

