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
相关产品推荐
相关产品推荐

