计算javascript中日期之间的差异

时间:2015-07-27 15:33:14

标签: javascript jquery date

我知道此问题之前被多次询问过,但建议的解决方案总是类似

var diff = date1 - date2;

我的问题是我希望在几年,几个月,一天,......,秒之间得到改变。

例如5y 3m 39d 12h 39i 32s

但仅仅区分差异对我来说太不准确了。 所以我不能假设每个月都有30.4375*24*60*60*1000毫秒。

我需要完全差异! 因此,如果date1是2月1日,而date2是3月1日,它应该显示1米而不是28天(或闰年29天)!

谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用moment.js来实现此目的:(MomentJS Doc

var start = moment(date1);
var end = moment(date2);
var diff = end.diff(start)

如果你想要特殊的事情,比如几天的差异,你可以这样做:

var diff = end.diff(start, 'days')

答案 1 :(得分:1)

首先,您需要找出哪个日期更大,减去日期,以及它们是否从较大的数字(与基本的多位数减法相似)为负借用。

function DateDiff(a,b){
    if(b>a){ // We want a-b to be positive
        var c=b;
        b=a;
        a=c;
    }
    var s=a.getSeconds()-b.getSeconds();
    var mi=a.getMinutes()-b.getMinutes();
    var h=a.getHours()-b.getHours();
    var d=a.getDate()-b.getDate(); // Subtract days
    var m=a.getMonth()-b.getMonth(); // Subtract months
    var y=a.getYear()-b.getYear(); // Subtract years
    if(s<0){
        mi--;
        s+=60;
    }
    if(mi<0){
        h--;
        mi+=60;
    }
    if(h<0){
        d--;
        h+=24;
    }
    if(d<0){ // Need to borrow from months
        m--;
        d+=new Date(1900+b.getYear(),1+b.getMonth(),0).getDate();
    }if(m<0){ // Need to borrow from years
        y--;
        m+=12;
    }
    return [y,m,d,h,mi,s];
}
console.log('Mar 1 - Feb 2 (Leap Year):', DateDiff(new Date(2016,1,2),new Date(2016,2,1)));
console.log('Mar 1 - Feb 2 (Reg Year): ',DateDiff(new Date(2015,1,2),new Date(2015,2,1)));
console.log('Feb 1, 2017 - Feb 2, 2016: ',DateDiff(new Date(2017,1,1),new Date(2016,1,2)));
console.log('5:00 - 4:59: ', DateDiff(new Date(2015,7,1,17), new Date(2015,7,1,16,59)));

答案 2 :(得分:0)

对于您所描述的内容,您需要将年/月/日保存在三个不同的变量中并使用

直接比较年份
    var yeardiff = date1.GetFullYear() - date2.GetFullYear();
    var monthdiff = date1.GetMonth() - date2.GetMonth();
    var daydiff = date1.GetDate() - date2.GetDate();

但是,您将不得不在此进行大量检查。例如,2012年8月2日 - 2012年7月20日将为您提供1个月和-18天,然后您必须根据7月份的天数将其转换为天数。由于这些问题,OP中的其他转换实际上更容易。

答案 3 :(得分:-1)

不使用任何你可以做的库

speed.on('scroll', callback(event))

function mydiff(aa,bb){var a,b; if(aa<bb) a=aa,b=bb; else a=bb,b=aa; var am=a.getMonth(),ay=a.getFullYear(); var dd=b.getDate()-a.getDate(); var dm=b.getMonth()-am-(dd<0?1:0); return b.getFullYear()-ay-(dm<0?1:0)+'y, ' + ((12+dm)%12)+'m, ' +((dd<0?new Date(ay, am+1, 0).getDate():0)+dd)+'d'; } 包含差异'b减去一个月中的a',这可能是负数。在这种情况下,月差dd必须减少1,而(负)日差必须增加前一个月dm的天数。我从here得到了“特定月份的天数”的公式。类似的行动必须与月份和年份差异bdm进行。

一些样本:

dm

最后一个例子表明,这种“计算”有其局限性:与“正常”月份相比,28天不是一个完整的月份。另一方面,与当月2月28日相比, 整整一个月。因此,也可以认为正确的答案应该是mydiff(new Date(2014,1,2),new Date(2014,2,1)) // "0y, 0m, 27d" mydiff(new Date(2012,1,1),new Date(2012,2,1)) // "0y, 1m, 0d" (leap year) mydiff(new Date(2012,1,2),new Date(2012,2,1)) // "0y, 0m, 28d" (leap year) mydiff(new Date(2014,11,31),new Date(2015,0,1)) // "0y, 0m, 1d" (different years) mydiff(new Date(2012,10,30),new Date(2013,1,28)) // "0y, 2m, 28d" (different years)