说明:Date、LocalDateTime都是Java中表示日期的两种类型,LocalDateTime是JDK8之后才有的,弥补了Date的缺陷和不足。
本文介绍Date、LocalDateTime类型互相转换的两种方式
Date转LocalDateTime
public static void main(String[] args) {
// Date 类型转为 LocalDateTime
Date date = new Date();
System.out.println("date = " + date);
// 方式一:
LocalDateTime localDateTime1 = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("localDateTime1 = " + localDateTime1);
// 方式二:使用hutool
LocalDateTime localDateTime2 = DateUtil.toLocalDateTime(date);
System.out.println("localDateTime2 = " + localDateTime2);
}
方式二需要在项目中引入hutool依赖,Maven坐标,如下
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.6</version>
</dependency>
瞄一眼源码,看下实现方式。
方式一是先获取一个 Instant 对象
接着获取 ZonedDateTime 实例
最后调用自身API,返回 LocalDateTime 类型
看下方式二
继续,也是先获取了 Instant 对象
go on,继续
把 Instant 对象,连同时区一起传入
进入到Java源码了
结合上面的时间、时区信息,创建了一个 LocalDateTime 对象
LocalDateTime转Date
也是两种方式
public static void main(String[] args) {
// localDateTime 类型转为 Date
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime = " + localDateTime);
// 方式一
Date date1 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("date1 = " + date1);
// 方式二:使用hutool
Date date2 = DateUtil.date(localDateTime);
System.out.println("date2 = " + date2);
}
运行可以看见,方式二生成的时间打印结果和方式一不一样,显然,hutool里面重写了toString()方法,瞄下源码。
通过上面这个方法,能知道两个信息:
-
LocalDateTime 和 TemporalAccessor 有继承关系,不然不可能传入;
-
DateTime 和 Date 也有继承关系,不然不可能返回;
我们只看返回,进入DateTime类,可见是hutool源码,继承了Java的Date对象;
直接找toString()方法。useJdkToStringStyle,是个私有属性,在类的开头,上面看继承关系的那张图里可见,初始值是false。继续看方法最后一行返回,调用了成员方法,传入了一个时区。
找到了,这里对返回的时间字符串做了格式化
总结
本文介绍了Date、LocalDateTime类型转换的两种方式