我知道这个问题之前曾被问过多次,但是建议的解决方案总是像

var diff = date1 - date2;


我的问题是我想获得年,月,日,...秒的差异。

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

但是,就我的目的而言,简单地划分差异实在是不准确的。
所以我不能假设每个月都有30.4375*24*60*60*1000毫秒。

我需要确切的区别!
因此,如果date1是2月1日,而date2是3月1日,则应显示1m,而不是28d(或leap年的29d)!

谢谢。

最佳答案

首先,您需要找出哪个日期更大,然后减去日期,然后从更大的数字中找出它们是否为负借项(类似于基本的多数字减法)。

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)));

10-07 19:11
查看更多