在实习过程中,遇到了很多学习的时候根本遇不到的坑。比如,刚刚接触公司代码的时候,各种日期和时间类型相当杂乱,最多的就是:Date、LocalDate、LocalDateTime。在开发的过程中,由于缺少规范,程序在开发自己的需求的时候更多是选择利于自己当前开发需求的日期时间类型,导致后期项目维护的时候,需要不停转换日期时间类型,更有甚者实体类中的生日字段为LocalDateTime,到了DTO中竟然直接变成了LocalDate,这对于我们这些对日期时间类型不甚了解或者转换不熟练的新程序员上手是一件十分繁琐的事情。所以在这里整理一下Java中的日期和时间类。
Date、LocalDate和LocalDateTime都是Java编程语言中表示日期和时间的类。
Date
Date是表示具体时间点的类,精确到毫秒。它是Java中最早的日期和时间类,它可以表示自1970年1月1日00:00:00以来的毫秒数。
这个类已经被废弃,Java 8之后建议使LocalDat和LocalDateTime类。
被弃用的原因
Java Date 类被弃用的原因是因为其设计存在一些问题,比如:
可变性:Java Date 对象是可变的,这意味着它们可以在不知情的情况下被其他代码修改,这可能导致不可预期的结果。
线程安全性:Java Date 类并不是线程安全的,因此在多线程环境下使用它可能会导致并发问题。
易混淆性:Java Date 类中的一些方法的行为不够清晰,例如 getYear() 方法返回的是从 1900 年开始算起的年份,而不是实际的年份。这可能导致混淆和错误的使用。
因此,Java Date 类已被弃用,取而代之的是 java.time 包中的新日期时间 API,该 API 具有不可变性、线程安全性和清晰的行为,使得在编写日期时间相关代码时更加安全和方便。
LocalDate
LocalDate是表示日期(年、月、日)但不包括时区的类。它不表示具体的时间点,而是日历日期。它是Java 8中引入的新日期和时间API的一部分,它代表一个不可变的日期对象,不包含时间和时区信息。这个类提供了很多有用的方法来处理日期,比如计算两个日期之间的差距、判断某个日期是否是闰年等等。与Date类不同的是,LocalDate类是不可变的,这意味着一旦创建了一个LocalDate对象,它的值就不能被修改。另外,LocalDate类还是线程安全的,可以在多线程环境中安全地使用。
LocalDateTime
LocalDateTime是表示日期和时间但不包括时区的类。它包括年、月、日、小时、分钟、秒和毫秒数。
相互转换
Date 转换成 LocalDate 或 LocalDateTime
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDate 或 LocalDateTime 转换成 Date
LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
LocalDateTime localDateTime = LocalDateTime.now();
Date date2 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
总结
Date 和 LocalDate 以及 LocalDateTime 最明显的区别就是,Date 表示的是1970年1月1日00:00:00以来的毫秒数,是一个精确时间点。而 LocalDate和LocalDateTime处理本地时间。而LocalDateTime又比LocalDate精确了时分秒,LocalDate只表示年月日。