1、需求:
1)下面两个时间进行比较:
Thu Jan 01 08:59:00 CST 1970
Thu Jan 01 08:48:00 CST 1970
=》比较结果:same
2)下面两个时间进行比较:
Thu Jan 01 08:00:00 CST 1970
Fri Jan 01 08:00:00 CST 2016
=>比较结果:diff
2、比较方法
这里就直接上代码了~列了五种只比较年月日,忽略时分秒的日期比较方式,以及各种方法的性能比较:
method 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static boolean sameDate(Date d1, Date d2) { if(null == d1 || null == d2) return false; Calendar cal1 = Calendar.getInstance(); cal1.setTime(d1); cal1.set(Calendar.HOUR_OF_DAY, 0); cal1.set(Calendar.MINUTE, 0); cal1.set(Calendar.SECOND, 0); cal1.set(Calendar.MILLISECOND, 0); Calendar cal2 = Calendar.getInstance(); cal2.setTime(d2); cal2.set(Calendar.HOUR_OF_DAY, 0); cal2.set(Calendar.MINUTE, 0); cal2.set(Calendar.SECOND, 0); cal2.set(Calendar.MILLISECOND, 0); return cal1.getTime().equals(cal2.getTime()); } |
method 2:
1 2 3 4 5 |
public static boolean sameDate(Date d1, Date d2){ SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); //fmt.setTimeZone(new TimeZone()); // 如果需要设置时间区域,可以在这里设置 return fmt.format(d1).equals(fmt.format(d2)); } |
method 3:
1 2 3 4 |
import org.apache.commons.lang.time.DateUtils; public static boolean sameDate(Date d1, Date d2){ DateUtils.isSameDay(date1, date2); } |
DateUtils提供的方法源码如下:
1 2 3 4 5 6 7 8 9 10 |
public static boolean sameDate(Date d1, Date d2) { if(null == d1 || null == d2) return false; //return getOnlyDate(d1).equals(getOnlyDate(d2)); Calendar cal1 = Calendar.getInstance(); cal1.setTime(d1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(d2); return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6); } |
其实上面的方法就是直接获取并比较了Calendar对象的纪元、年份和所在年份的第几天,这样来比较日期会比上面两种方法快。
method 4:
1 2 3 4 5 6 7 8 9 |
import org.joda.time.LocalDate; import org.joda.time.DateTime; public static Boolean sameDate(Date dt1 , Date dt2 ) { LocalDate ld1 = new LocalDate(new DateTime(dt1)); LocalDate ld2 = new LocalDate(new DateTime(dt2)); return ld1.equals( ld2 ); } |
如果是Maven,需要添加下面的依赖:
1 2 3 4 5 |
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.2</version> </dependency> |
method 5:
这个是Java8中Java.time提供的方法
1 2 3 4 5 |
private static boolean sameDate(Date d1, Date d2) { LocalDate localDate1 = ZonedDateTime.ofInstant(d1.toInstant(), ZoneId.systemDefault()).toLocalDate(); LocalDate localDate2 = ZonedDateTime.ofInstant(d2.toInstant(), ZoneId.systemDefault()).toLocalDate(); return localDate1.isEqual(localDate2); } |
通过性能比较,method 4和method 5的速度较其他几种方法显著提升,其中method 4较method 5快一点点,method 2最慢。所以如果程序中需要多次比较日期的话,建议用method 4和5。