java 求日期差

来源:互联网 发布:php加密函数 编辑:程序博客网 时间:2024/05/01 17:49

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 函数取得特定日期到197011日凌晨的毫秒数,除以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、除以一天的毫秒数得到相差的天数

0 0
原创粉丝点击