Java比较日期对象

示例

日历,日期和LocalDate

Java SE 8

之前,之后,compareTo和equals方法

//日历和日期对象的使用    
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();

final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();

//之前的例子
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));

//之后的例子
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));

//比较例子
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));

//平等的例子
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
            Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
            "Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
            Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));

//从日历中清除毫秒
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();

System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
            Boolean.valueOf(birthdate.equals(samebirthdate)));
Java SE 8

isBefore,isAfter,compareTo和equals方法

//使用LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);

//小时,分钟,秒和nanoOfsecond也可以与其他类LocalDateTime一起配置
//LocalDateTime.of(年,月,日,月,小时,分钟,秒,nanoOfSecond);

//isBefore示例
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));

//isAfter示例
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));

//compareTo示例
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));

//等于例子
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));

//isEqual示例
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));

Java 8之前的日期比较

在Java 8之前,可以使用java.util.Calendar和java.util.Date类比较日期。Date类提供4种比较日期的方法:

  • after(Date when)

  • before(Date when)

  • compareTo(Date anotherDate)

  • equals(Object obj)

after,before,compareTo和equals方法通过比较返回的值getTime()对于每个日期的方法。

compareTo 方法返回正整数。

  • 大于0的值:当Date在Date参数之后

  • 大于0的值:当Date在Date参数之前

  • 值等于0:当Date等于Date参数时

equals 如示例中所示,结果可能令人惊讶,因为如果未明确给出值,则毫秒等值不会使用相同的值进行初始化。

从Java 8开始

在Java 8中,可以使用java.time.LocalDate使用Date的新对象。LocalDate实现ChronoLocalDate,它是可插入Chronology或日历系统的日期的抽象表示。

为了具有日期时间精度,必须使用对象java.time.LocalDateTime。LocalDate并LocalDateTime使用相同的方法名称进行比较。

使用a比较日期与使用a比较日期LocalDate是不同的,ChronoLocalDate因为不考虑年代或日历系统的第一个日期。

因为大多数应用程序都应使用LocalDate,ChronoLocalDate所以示例中未包含。在这里进一步阅读。

大多数应用程序应将方法签名,字段和变量声明为LocalDate,而不是this [ChronoLocalDate]接口。

LocalDate 有5种比较日期的方法:

  • isAfter(ChronoLocalDate other)

  • isBefore(ChronoLocalDate other)

  • isEqual(ChronoLocalDate other)

  • compareTo(ChronoLocalDate other)

  • equals(Object obj)

在的情况下,LocalDate参数,isAfter,isBefore,isEqual,equals和compareTo现在使用这种方法:

int compareTo0(LocalDate otherDate) {
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

equals方法检查参数引用是否首先等于日期而isEqual直接调用compareTo0。

如果是其他类别的实例,ChronoLocalDate则使用来比较日期Epoch Day。时代天计数是天的简单递增计数,其中天0为1970-01-01(ISO)。