Java新的日期时间处理工具类和传统的Date之间的相互转换和一些注意事项。最需要注意的是Date存储的是标准UTC毫秒数,而LocateDateTime带有时区信息。在转换的时候如果不能正确理解,会导致时间转换错误。

Java8新出的日期时间API:Instant,LocalDate,LocalTime,LocalDateTime。提供了一系列用于创建、格式化、解析、计算、修改时间的方法。

在此前,大部分人都是通过Date和SimpleDateFormat来进行日期相关的操作,由于SimpleDateFormat提供的方法不是线程安全的,因此多线程情况下容易出现日期解析错误问题。

提供的方法可以看文档学习一下,这里先记录一下最棘手的Date和LocalDateTime之间的转换问题。

Date to LocalDateTime:

Date todayDate = new Date();
LocalDateTime ldt = todayDate.toInstant()
        .atOffset(ZoneOffset.UTC)
        .toLocalDateTime();

LocalDateTime to Date:

LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.toInstant(ZoneOffset.UTC));

两者之间的转换都需要通过Instant来实现,Instant存储的就是一个时间线上的时间点,是一个时间戳。因此为了这个时间戳是正确的,需要设置正确的时区或者偏移量。

举个例子说明,使用LocalDateTIme获取系统当前时间,然后转换成Date,用作ORM框架(目前普遍还是使用Date进行日期映射)。

LocalDateTime now = LocalDateTime.now();
System.out.println(new Date()); // Tue Feb 27 13:58:55 CST 2024
System.out.println(now); // 2024-02-27T13:58:55.259214
System.out.println(Date.from(now.atZone(ZoneId.systemDefault()).toInstant())); // Tue Feb 27 13:58:55 CST 2024
// 另一种写法
// System.out.println(Date.from(now.toInstant(ZoneOffset.of("+08:00"))));

System.out.println(Date.from(now.toInstant(ZoneOffset.UTC))) // Tue Feb 27 21:58:55 CST 2024

可以看到使用LocalDateTime获取当前时间,是从系统时钟获取的时间戳,一般都是Asia/Shanghai(GMT+8),并转换成Date,也使用Asia/Shanghai时区,,因此时间戳会比UTC时间多8个小时,如果使用不设置偏移量,而是使用ZoneOffset.UTC(偏移为0),导致生成的时间多了8小时。

最后修改:2024 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏