关于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)
- 3位
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
相关产品推荐
相关产品推荐

