
最近解析别人的 API,分钟一直对不上,后来发现 Date 类解析有误,换成 LocalDataTime 就好了,网上资料很少,于是就来这里求解答了。具体代码如下。
public class DateFormat { public static void main(String[] args) throws ParseException { String strDate = "2020-02-25T0:13:28.620818Z"; String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); Date date = simpleDateFormat.parse(strDate); System.out.println(date); LocalDateTime localDateTime = LocalDateTime.parse(strDate, DateTimeFormatter.ofPattern(pattern)); System.out.println(localDateTime); } } > Task :DateFormat.main() Tue Feb 25 03:23:48 CST 2020 2020-02-25T03:13:28.620818 可以看到 SimpleDateFormat 解析出来的比正确值多了 10 分钟左右,我算了下差不多是 620818 毫秒=10.3469666 分钟,这算是 Java 老接口的 Bug 吗?
1 chendy 2020 年 3 月 4 日 1000 毫秒 = 1 秒,所以并不存在 6 位的毫秒 SImpleDateFormat 的 S 是毫秒,所以会多(为啥不报错呢… DateTimeFormatter 的 S 是 fraction-of-second,S 越多精度越高,最多 9 个 S 显示到纳秒 |
2 also24 2020 年 3 月 4 日 题外话:Z 不是 0 时区么?怎么转出来 CST 时间还是一样的? |
3 dallaslu 2020 年 3 月 4 日 就是微秒嘛,普通的只到毫秒 |
4 alfredcai OP @chendy 我可能表达不清楚,我是想出 Date 解析小数点后 6 位出错。它把 .620818 当成 620818 毫秒了,算出来就多了十分钟。我现在觉得是 Date 的精度只支持到小数点后 3 位,也就是毫秒级别。从下面的代码里可以看出这点。 ```java Date d = new Date(); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(d)); ``` ``` 2020-03-04 22:14:06.518 2020-03-04 22:14:06.000518 ``` 第二个打印出来只是把 518 向后移了 3 位,但我希望是.518123 再多显示三位,也就是精确到微秒。 |
5 SoloCompany 2020 年 3 月 4 日 老式 Date api 以及 SimpleDateFormat 只支持毫秒精度, 并且小数点后的数字作为整数而非小数解释, 所以如果要使用 SimpleDateFormat 的话, 只能手动把六位微秒进行截断 /补 0 凑够刚好三位才可以 或许也可以选择使用 java.sql.Timestamp 比如 java.sql.Timestamp.valueOf("2020-02-25T03:13:28.620818Z".replace("T", " ").replace("Z", "")) 可以解释小数点, 最高精度 9 位 (纳秒) |
6 alfredcai OP @also24 还好上来发帖,帮忙指出错误。感谢感谢。所以之前自己写的都是错的。pattern 应该是"yyyy-MM-dd'T'HH:mm:ss.SSSX"。LocalDateTime 换成 ZoneDateTime |
8 br00k 2020 年 3 月 5 日 via iPhone Instant.parse("2020-02-25T03:13:28.620818Z") |