//日历和日期对象的使用 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)));
//使用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.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.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)。