Part 1 求两个日期相差多少天
public long getDateDiff(Date date1, Date date2){
long s1 = date1.getTime();
long s2 = date2.getTime();
long interval = s2/86400000 - s1/86400000;//86400000=24*3600*1000 一天的毫秒数
return interval;
}
一开始是这么想的:使用getTime 函数取得特定日期到1970年1月1日凌晨的毫秒数,除以86400000后得到天数,两个天数相减就可以得到日期差。
实际测试却发现有错误:比如date1 = “2014-8-23 1:0:0”, date2 = “2014-8-23 13:0:0”
两个的日期差却是1
完整测试代码如下
class DateDiff{
public long getDateDiff(Date date1, Date date2){
long s1 = date1.getTime();
long s2 = date2.getTime();
long interval = s2/86400000 - s1/86400000;
return interval;
}
public static void main(String[] args)throws ParseException{
Date date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-08-23 1:59:59");
Date date2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-08-23 11:59:59");
DateDiff dateDiff = new DateDiff();
System.out.println("" + dateDiff.getDateDiff(date1, date2));//1
}
}
没有马上想明白这个问题,就换了另一种方法求日期差。后来在发呆时灵光一闪,中国是东八区,英国19701-1-1的凌晨,在中国则是早上8点!所以对于北京时间来说,早上8点才是分界线,按前面的方法计算,同一天的8点前和8点后差了一天。
Part 2 求日期差的有效方法
虽然前面是错误的方法,但也提供了一条思路。
我们忽略两个日期的时分秒部分,求出相差的毫秒数,就可以求出相差的天数了。
private void setMidnight(Calendar cal){
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
}
public long getDateDiff(Date date1, Date date2){
Calendar cal1=Calendar.getInstance();
Calendar cal2=Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
setMidnight(cal1);
setMidnight(cal2);
long s1 = cal1.getTimeInMillis();
long s2 = cal2.getTimeInMillis();
long interval = (s2 - s1)/86400000;
return interval;
}
代码思路:
1、获得两个日历对象
2、将两个日期分别设置给两个日历
3、将日历的时分秒部分都设置为0
4、获得两个日历相差的毫秒数
5、除以一天的毫秒数得到相差的天数