比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法

来源:互联网 发布:mac win8 无声音 编辑:程序博客网 时间:2024/06/07 05:02

    介绍几种比较Date年月日的方法

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:

[java] view plain copy
  1. public static boolean sameDate(Date d1, Date d2) {  
  2.     if(null == d1 || null == d2)  
  3.         return false;  
  4.     Calendar cal1 = Calendar.getInstance();  
  5.     cal1.setTime(d1);  
  6.     cal1.set(Calendar.HOUR_OF_DAY, 0);  
  7.     cal1.set(Calendar.MINUTE, 0);  
  8.     cal1.set(Calendar.SECOND, 0);  
  9.     cal1.set(Calendar.MILLISECOND, 0);  
  10.     Calendar cal2 = Calendar.getInstance();  
  11.     cal2.setTime(d2);  
  12.     cal2.set(Calendar.HOUR_OF_DAY, 0);  
  13.     cal2.set(Calendar.MINUTE, 0);  
  14.     cal2.set(Calendar.SECOND, 0);  
  15.     cal2.set(Calendar.MILLISECOND, 0);  
  16.     return  cal1.getTime().equals(cal2.getTime());  
  17. }  

method 2:

[java] view plain copy
  1. public static boolean sameDate(Date d1, Date d2){  
  2.     SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");  
  3.     //fmt.setTimeZone(new TimeZone()); // 如果需要设置时间区域,可以在这里设置  
  4.     return fmt.format(d1).equals(fmt.format(d2));  
  5. }  

method 3:

[java] view plain copy
  1. import org.apache.commons.lang.time.DateUtils;  
  2. public static boolean sameDate(Date d1, Date d2){         
  3.    DateUtils.isSameDay(date1, date2);  
  4.  }  

DateUtils提供的方法源码如下:

[java] view plain copy
  1. public static boolean sameDate(Date d1, Date d2) {  
  2.     if(null == d1 || null == d2)  
  3.         return false;  
  4.     //return getOnlyDate(d1).equals(getOnlyDate(d2));  
  5.     Calendar cal1 = Calendar.getInstance();  
  6.     cal1.setTime(d1);  
  7.     Calendar cal2 = Calendar.getInstance();  
  8.     cal2.setTime(d2);  
  9.     return  cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);  
  10. }  

其实上面的方法就是直接获取并比较了Calendar对象的纪元、年份和所在年份的第几天,这样来比较日期会比上面两种方法快。

method 4:

[java] view plain copy
  1. import org.joda.time.LocalDate;  
  2. import org.joda.time.DateTime;  
  3.   
  4.     public static Boolean sameDate(Date dt1 , Date dt2 )  
  5.     {  
  6.         LocalDate ld1 = new LocalDate(new DateTime(dt1));  
  7.         LocalDate ld2 = new LocalDate(new DateTime(dt2));  
  8.         return ld1.equals( ld2 );  
  9.     }  

如果是Maven,需要添加下面的依赖:

[java] view plain copy
  1. <dependency>  
  2.     <groupId>joda-time</groupId>  
  3.     <artifactId>joda-time</artifactId>  
  4.     <version>2.9.2</version>  
  5. </dependency>  

method 5:

这个是Java8中java.time提供的方法

[java] view plain copy
  1. private static boolean sameDate(Date d1, Date d2) {  
  2.     LocalDate localDate1 = ZonedDateTime.ofInstant(d1.toInstant(), ZoneId.systemDefault()).toLocalDate();  
  3.     LocalDate localDate2 = ZonedDateTime.ofInstant(d2.toInstant(), ZoneId.systemDefault()).toLocalDate();  
  4.     return localDate1.isEqual(localDate2);  
  5. }  

    通过性能比较,method 4和method 5的速度较其他几种方法显著提升,其中method 4较method 5快一点点,method 2最慢。

    所以如果程序中需要多次比较日期的话,建议用method 4和5。

阅读全文
0 0
原创粉丝点击