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小时。 ``` ``` Loading... 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 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏