`
Luob.
  • 浏览: 1574694 次
  • 来自: 上海
社区版块
存档分类
最新评论

Java 计算两个日期相差的天数

    博客分类:
  • Java
阅读更多
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


public class test16 {

	/**
	 * @param args
	 * @throws ParseException 
	 */
	public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d1=sdf.parse("2012-09-08 10:10:10");
		Date d2=sdf.parse("2012-09-15 00:00:00");
		System.out.println(daysBetween(d1,d2));

		System.out.println(daysBetween("2012-09-08 10:10:10","2012-09-15 00:00:00"));
	}
	
	/** 
     * 计算两个日期之间相差的天数 
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
	 * @throws ParseException 
     */  
    public static int daysBetween(Date smdate,Date bdate) throws ParseException  
    {  
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    	smdate=sdf.parse(sdf.format(smdate));
    	bdate=sdf.parse(sdf.format(bdate));
        Calendar cal = Calendar.getInstance();  
        cal.setTime(smdate);  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(bdate);  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);
          
       return Integer.parseInt(String.valueOf(between_days));         
    }  
    
/**
*字符串的日期格式的计算
*/
    public static int daysBetween(String smdate,String bdate) throws ParseException{
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();  
        cal.setTime(sdf.parse(smdate));  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(sdf.parse(bdate));  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);
          
       return Integer.parseInt(String.valueOf(between_days));   
    }

}
3
9
分享到:
评论
9 楼 tlghb 2013-03-13  
有可能还要去除节假日
8 楼 Foxswily 2012-09-14  
计算个日期要写这么多代码,各种抱怨早就有了,JSR-310http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen会有应对,大概要等到Java 8....

现在也有类库可用,比如Jodahttp://joda-time.sourceforge.net/
7 楼 willsonbin 2012-09-14  
好东西.。之前写图书馆管理系统有遇到过..
6 楼 captmjc 2012-09-13  
对,漏掉了时区因素。因为getTime()返回的永远是UTC时间,也就是时区永远比我们晚8个小时。所以,你还是calendar吧。或者不介意deprecated的话
	public static int daysBetween(Date smdate, Date bdate) {
		return (int)(((bdate.getTime() + bdate.getTimezoneOffset() * 60000L)/ 86400000L) - ((smdate.getTime() + smdate.getTimezoneOffset() * 60000L) / 86400000L));
	}
5 楼 Luob. 2012-09-13  
开始写这东西的时候和你写的一样,可是发现 时间上设置巧妙点,计算出来就不对了.不得已在这样写,没有找到原因。10 个小时不足一天 就不知道 怎么算出来多了一个1
4 楼 Luob. 2012-09-13  
captmjc 写道
captmjc 写道
public static int daysBetween(Date smdate,Date bdate) {
  return (int)((smdate.getTime() / 86400000L) - (bdate.getTime() / 86400000L));
}

利用整除,算出两个日期分别距离epoch(1970-01-01T00:00:00.000Z)的天数,然后减一下就可以了

补充一下,你之所以先format再parse是为了消除时分秒的影响。整除其实已经解决了这个问题,但是速度显然...


速度确实 有很大影响,
但是 我想说的
2012-09-08 10:00:00----2012-09-15 00:00:00  其实相隔 7天

上面写的有待优化
3 楼 Luob. 2012-09-13  
captmjc 写道
public static int daysBetween(Date smdate,Date bdate) {
  return (int)((smdate.getTime() / 86400000L) - (bdate.getTime() / 86400000L));
}

利用整除,算出两个日期分别距离epoch(1970-01-01T00:00:00.000Z)的天数,然后减一下就可以了

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1=sdf.parse("2012-09-08 10:00:00");
Date d2=sdf.parse("2012-09-15 00:00:00");
System.out.println(daysBetween(d1,d2));
这样测试的时候 为 -6
2 楼 captmjc 2012-09-13  
captmjc 写道
public static int daysBetween(Date smdate,Date bdate) {
  return (int)((smdate.getTime() / 86400000L) - (bdate.getTime() / 86400000L));
}

利用整除,算出两个日期分别距离epoch(1970-01-01T00:00:00.000Z)的天数,然后减一下就可以了

补充一下,你之所以先format再parse是为了消除时分秒的影响。整除其实已经解决了这个问题,但是速度显然...
1 楼 captmjc 2012-09-13  
public static int daysBetween(Date smdate,Date bdate) {
  return (int)((smdate.getTime() / 86400000L) - (bdate.getTime() / 86400000L));
}

利用整除,算出两个日期分别距离epoch(1970-01-01T00:00:00.000Z)的天数,然后减一下就可以了

相关推荐

Global site tag (gtag.js) - Google Analytics