您的位置:

了解LocalDateTime:从比较大小入手

一、LocalDate比较日期大小

LocalDate 是不含时分秒的日期时间格式,它包含年月日等基本信息。我们可以使用 compareTo() 方法进行日期的比较大小。如果 this 比参数 date 小,则返回负数;如果 this 比参数 date 大,则返回正数;如果相等,则返回0。


LocalDate date1 = LocalDate.of(2022, 3, 20);
LocalDate date2 = LocalDate.of(2022, 3, 21);
int compareTo = date1.compareTo(date2);
System.out.println(compareTo); //-1

此时我们可以得出,date1 小于 date2,返回结果为 -1。

二、LocalDate和LocalDateTime

LocalDateTime 是包含时分秒的日期时间格式,它除了拥有 LocalDate 的基本信息之外,还包含有时分秒的信息。同样地,我们可以使用 compareTo() 方法进行日期时间的比较大小。


LocalDate localDate = LocalDate.of(2022, 3, 20);
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.of(15, 30, 20));
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, LocalTime.of(18, 30, 40));
int compareTo = localDateTime.compareTo(localDateTime2);
System.out.println(compareTo); //-1

此时我们可以得出,localDateTime 小于 localDateTime2,返回结果为 -1。

三、LocalDateTime计算时间差

LocalDateTime 支持各种加减运算,通过 plus(…) 和 minus(…) 可以对 LocalDateTime 进行时间计算。我们常用的还有 between(…) 方法,如下所示:


LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 20, 19, 30, 0);
LocalDateTime localDateTime2 = LocalDateTime.of(2022, 3, 20, 22, 30, 0);
Duration between = Duration.between(localDateTime, localDateTime2);
System.out.println(between.getSeconds()); //10800

此时我们可以得出 localDateTime 与 localDateTime2 的时间差为 3 小时。

四、LocalDateTime怎么比较大小

与LocalDate和LocalTime不同,LocalDateTime 类型的比较,需要先调用 isBefore() 或 isAfter() 方法,再判断compareTo() 方法的返回值。如下所示:


LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 20, 19, 30, 0);
LocalDateTime localDateTime2 = LocalDateTime.of(2022, 3, 20, 22, 30, 0);
boolean isBefore = localDateTime.isBefore(localDateTime2);
boolean isAfter = localDateTime.isAfter(localDateTime2);
int compareTo = localDateTime.compareTo(localDateTime2);
System.out.println(isBefore); //true
System.out.println(isAfter); //false
System.out.println(compareTo); //-1

通过此例我们可以得出,localDateTime 小于 localDateTime2,返回结果为 -1。

五、Date和LocalDateTime的区别

Date 是 Java 8 以前版本中用于表示日期时间的类型,不容易进行日期时间格式的操作,而 LocalDate、LocalDateTime 类型则是 Java 8 以后新增的类。Date 对象是可变且线程不安全的,而 LocalDateTime 类型是不可变且线程安全的。

下面我们通过代码展示 LocalDateTime 与 Date 类型的比较:


Date date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2022-03-20 23:30:00");
LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 20, 23, 30, 0);
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date date2 = Date.from(instant);
System.out.println(date1.compareTo(date2)); //0

通过此例我们可以看出,Date 对象与 LocalDateTime 类型经过转换后,可以进行日期时间的比较。