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

相同输入字符串下DateTimeFormatter与SimpleDateFormat解析结果不一致

差异根本原因

SimpleDateFormat和DateTimeFormatter对模式串中S(秒的小数部分)的解析规则完全不同,该差异和代码逻辑无关,属于两个API的设计规则差异:

  • 你使用的时间字符串中秒的小数部分为09(仅2位),而模式串配置为SSS(3个S)
  • SimpleDateFormat会将传入的秒小数部分直接作为整数毫秒处理:09被识别为9毫秒,最终解析得到的时间戳为1631885820009
  • DateTimeFormatter会将SSS对应到三位小数位,不足三位时末尾补0:09补0后变为090,被识别为90毫秒,最终解析得到的时间戳为1631885820090

兼容适配方案

如果业务场景中存在1~3位不等的毫秒值,可选择两种适配方案:

  1. 直接使用JDK内置的DateTimeFormatter.ISO_INSTANT,它原生兼容ISO8601标准格式,支持1~9位的秒小数部分解析,无需额外配置时区
  2. 若需要自定义模式串,可通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:54:03