比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
2016-12-16 11:39
1446 查看
介绍几种比较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:
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:
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:
import org.apache.commons.lang.time.DateUtils;
public static boolean sameDate(Date d1, Date d2){
DateUtils.isSameDay(date1, date2);
}
DateUtils提供的方法源码如下:
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:
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,需要添加下面的依赖:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
method 5:
这个是Java8中java.time提供的方法
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。
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:
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:
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:
import org.apache.commons.lang.time.DateUtils;
public static boolean sameDate(Date d1, Date d2){
DateUtils.isSameDay(date1, date2);
}
DateUtils提供的方法源码如下:
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:
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,需要添加下面的依赖:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
method 5:
这个是Java8中java.time提供的方法
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。
相关文章推荐
- 比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
- 比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
- Java比较两个数组中的元素是否相同的最简单方法
- java采用DateFormat日期格式化方法判断用户今天是否第一次登录(比较简单)
- Java对数组的操作(三)—比较两个数组中的元素是否相同的最简单方法
- 将Fri May 04 17:25:34 CST 2012形式的日期字符串转换成java.util.Date对象的方法
- 比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- Java比较两个List的值是否相等的方法
- 比较两个实例对象是否相同的方法
- java方法,返回两个日期内的所有date集合,根据开始时间、结束时间得到两个时间段内所有的日期
- java 比较两个文件是否相同
- java比较两个对象是否相等的方法
- Java String和Date的转换以及java.util.Date和java.sql.Date的区别和相互转化及取得年月日的方法
- JAVA比较两个数组中的元素是否相同
- JAVA 比较两个日期相差的天数的方法比较
- 比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- java使用计算md5校验码方式比较两个文件是否相同
- java比较文件内容是否相同的方法
- java方法,返回两个日期内的所有date集合,根据开始时间、结束时间得到两个时间段内所有的日期
- java快速比较两个文件是否相同