相同输入字符串下DateTimeFormatter与SimpleDateFormat解析结果不一致
差异根本原因
SimpleDateFormat和DateTimeFormatter对模式串中S(秒的小数部分)的解析规则完全不同,该差异和代码逻辑无关,属于两个API的设计规则差异:
- 你使用的时间字符串中秒的小数部分为
09(仅2位),而模式串配置为SSS(3个S) SimpleDateFormat会将传入的秒小数部分直接作为整数毫秒处理:09被识别为9毫秒,最终解析得到的时间戳为1631885820009DateTimeFormatter会将SSS对应到三位小数位,不足三位时末尾补0:09补0后变为090,被识别为90毫秒,最终解析得到的时间戳为1631885820090
兼容适配方案
如果业务场景中存在1~3位不等的毫秒值,可选择两种适配方案:
- 直接使用JDK内置的
DateTimeFormatter.ISO_INSTANT,它原生兼容ISO8601标准格式,支持1~9位的秒小数部分解析,无需额外配置时区 - 若需要自定义模式串,可通过
DateTimeFormatterBuilder指定毫秒位的长度范围,示例代码如下:
val newFormatter = DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd'T'HH:mm:ss") .appendFraction(ChronoField.MILLI_OF_SECOND, 1, 3, true) .appendPattern("XXX") .toFormatter() .withZone(ZoneId.of("UTC"))
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

