Java 8中处理日期和时间的个人心得

2022-04-05   


阿里《Java开发手册》里提到过这么一点。

使用Instant替代Date,使用LocalDateTime替代Calendar。

感觉不知道原因,之前看过也没理解透彻。今天把书又看了一遍并实验了一番,感觉确实时间处理被这些新增类整理的挺干净。而且原来我非常头大的时区转换这块也方便了不少,把代码记录一下。

LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
System.out.println(zdt);
zdt = zdt.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
System.out.println(zdt);

输出:
2017-05-28T17:10:32.905+08:00[Asia/Shanghai]
2017-05-28T18:10:32.905+09:00[Asia/Tokyo]

总的来说,就是LocalDate记录不带时分秒的日期。
LocalDateTime记录带时分秒的日期。
ZonedDateTime比LocalDateTime更进一步增加了时区的信息。
Instant是计算机更容易理解的时间戳。
这些类的对象都是不可变的,用静态工厂方法(of)或转换(with)等方法生成副本,保证了多线程下的安全。

最后,记录一下原来的时间类转换为ZonedDateTime的方法。

new GregorianCalendar().toZonedDateTime();
new Date().toInstant().atZone(ZoneId.systemDefault());

Q.E.D.


Talk is cheap, show me the code