关于Date、LocalDate、LocalDateTime、Timestamp等时间类型的区别?

发布时间 2023-10-12 23:40:01作者: Great-R

最近在代码的开发过程中发现,小组内对于实体类中的时间字段。有的用Date,有的用Timestamp,有的又用LocalDateTime,于是我就想整理一下这些时间类型有什么区别,是否可以统一?
1、Date(不推荐)
Date类型是Java8之前的时间处理类,存在一些问题比如说非线程安全问题。时区的处理比较麻烦等。
Date类型的基本使用:

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(date);//当前时间 2023-10-12

Date类型目前许多方法已经弃用了。
2、Calendar类(不推荐)
Calendar(日历)类,主要的功能是用来日期字段间的操作,更像是对Date类的增强。里面有许多的方法,可以获取当前年份、月份、日期等等的

Calendar calendar = Calendar.getInstance();
System.out.println("年:" + calendar.get(Calendar.YEAR));//年:2023
// 初始月份是从0开始
System.out.println("月:" + (calendar.get(Calendar.MONTH)+1));//月:10
System.out.println("日:" + calendar.get(Calendar.DATE));//日:12
System.out.println("小时:" + calendar.get(Calendar.HOUR_OF_DAY));//小时:23
System.out.println("分钟:" + calendar.get(Calendar.MINUTE));//分钟:0
System.out.println("秒:" + calendar.get(Calendar.SECOND));//秒:36
System.out.println("毫秒:" + calendar.get(Calendar.MILLISECOND));//毫秒:534
System.out.println("今年的第几个星期:" + calendar.get(Calendar.WEEK_OF_YEAR));//今年的第几个星期:41
System.out.println("这个月的第几个星期:" + calendar.get(Calendar.WEEK_OF_MONTH));//这个月的第几个星期:2
System.out.println("今年的第几天:" + calendar.get(Calendar.DAY_OF_YEAR));//今年的第几天:285
System.out.println("这个月的第几天:" + calendar.get(Calendar.DAY_OF_MONTH));//这个月的第几天:12
System.out.println("这个星期的第几天:" + calendar.get(Calendar.DAY_OF_WEEK));//这个星期的第几天:5

如果有需要用到一些方法可以使用使用
3、LocalDateTime类(推荐)
LocalDate、LocalTime、LocalDateTime类是Java1.8开始对时间类进行的一次大更新,它是在java.time包中,功能十分强大。
LocalDate:用来获取日期格式(年月日)
LocalTime:用来获取时间格式(时分秒)
LocalDateTime:用来获取日期+时间的格式

 LocalDate localDate = LocalDate.now();
 LocalTime localTime = LocalTime.now();
 LocalDateTime localDateTime = LocalDateTime.now();
 System.out.println(localDate);//2023-10-12
 System.out.println(localTime);//23:13:59.259
 System.out.println(localDateTime);//2023-10-12T23:13:59.259
 System.out.println(localDateTime.getDayOfMonth());//12
 System.out.println(localDateTime.getDayOfWeek());//THURSDAY
 System.out.println(localDateTime.getMonth());//OCTOBER
 System.out.println(localDateTime.getMonthValue());//10
 System.out.println(localDateTime.getMinute());//13

LocalDateTime还提供了很多其他时间操作方法,比如说时间相加相减等等。设置时间格式也可以使用DateTimeFormatter,相比于SimpleDateFormat最大的好处就是在于DateTimeFormatter 是线程安全的。
总结
我个人是推荐使用LocalDateTime(jdk1.8),很多时候我们不知道数据与Java类型如何去对应。我推荐的方式是
date类型(日期时间格式)使用LocalDate去对应
time类型(时分秒时间格式)使用LocalTime去对应
datetime类型(完整的日期时分秒时间格式)使用LocalDateTime去对应
timestamp类型(完整的日期时分秒时间格式)使用LocalDateTime去对应