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

Java解析JSON中带微秒的日期字符串报错问题排查

解决Java解析带微秒与时区的日期字符串问题

嗨,我来帮你搞定这个日期解析的坑!首先明确说:不是Java不支持微秒级小数部分,问题出在你的格式字符串写错了,另外还要看你用的是Java哪个版本的日期API——毕竟旧API和新API的处理方式差别很大。

情况1:使用Java 8及以上版本(强烈推荐)

Java 8引入的新日期时间API(java.time包)完全支持微秒和带冒号的时区格式,而且这个日期字符串是标准的ISO-8601格式,甚至不用手动写格式就能直接解析:

String dateStr = "2018-04-06T10:22:47.643271+02:00";
// 直接解析,因为格式符合ISO-8601标准
OffsetDateTime dateTime = OffsetDateTime.parse(dateStr);
System.out.println(dateTime);

如果非要手动指定格式字符串,正确的写法是:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX");
OffsetDateTime dateTime = OffsetDateTime.parse(dateStr, formatter);

这里的SSSSSS对应6位微秒,XXX对应带冒号的时区(比如+02:00)。

情况2:不得不使用旧的SimpleDateFormat(不推荐)

旧的SimpleDateFormat确实对超过3位的毫秒部分支持不佳——它会把643271当成643271毫秒(也就是1分43秒多),这显然不符合你的需求。而且它的时区格式符Z只支持不带冒号的形式(比如+0200),所以需要先处理字符串:

String dateStr = "2018-04-06T10:22:47.643271+02:00";
// 第一步:把6位微秒截断为3位毫秒;第二步:去掉时区里的冒号
String processedDate = dateStr.replaceFirst("(\\.\\d{3})\\d+", "$1").replace(":", "", 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = sdf.parse(processedDate);
System.out.println(date);

总结

优先用Java 8+的java.time包下的类(比如OffsetDateTime、ZonedDateTime),它们不仅原生支持微秒和标准时区格式,还线程安全,避免了SimpleDateFormat的各种潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:10