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

关于DateTimeFormatter匹配SWAPI日期格式:SSSSSS与nnnnnn哪个正确?

解析SWAPI日期格式:SSSSSS vs nnnnnn

这问题问得很到位!我来帮你拆解清楚两者的区别,以及正确的选择:

核心区别:S 和 n 的含义

在Java的DateTimeFormatter中,这两个模式符号代表完全不同的时间分量:

  • S:秒的小数部分:它直接对应秒后面的小数位,每一位代表的是**10-3秒(毫秒)**、10-6秒(微秒)或10^-9秒(纳秒),取决于位数:
    • 3位SSS → 毫秒级(000-999)
    • 6位SSSSSS → 微秒级(000000-999999)
    • 9位SSSSSSSSS → 纳秒级(000000000-999999999)
  • n:纳秒:它代表的是单独的纳秒分量,范围是0-999999999,每一位对应1纳秒。比如6位nnnnnn只会解析字符串中的前6位作为纳秒值(即000000-999999纳秒,等于0-0.999999毫秒)。

针对SWAPI日期的正确选择

SWAPI返回的日期格式2014-12-09T13:50:51.644000Z中,.644000是秒的小数部分(即0.644000秒 = 644毫秒 = 644000微秒),所以:

  • 使用yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'是正确的:它会把.644000解析为644000微秒,对应正确的时间戳。
  • 使用yyyy-MM-dd'T'HH:mm:ss.nnnnnn'Z'是错误的:它会把.644000解析为644000纳秒(仅0.644毫秒),导致解析出的时间比实际值慢了0.643356秒,这显然不符合预期!

更简单的方案:使用预定义格式化器

其实你完全不需要自定义模式,因为这个格式是标准的ISO 8601即时格式,Java已经提供了预定义的DateTimeFormatter.ISO_INSTANT,它可以自动处理1-9位的秒小数部分,直接用它解析即可:

DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
Instant created = Instant.from(formatter.parse("2014-12-09T13:50:51.644000Z"));

这样既简洁又不容易出错,推荐优先使用!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:18