4 个回答

偶然发现一篇帖子,解决了问题 代码如下

/**
 * @desc 计算年龄
 * 计算年份->计算月份->计算天数
 *
 * @date 2015-09-22
 * @author WadeYu
 */

var getDiffYmdBetweenDate = function(sDate1,sDate2){
    var fixDate = function(sDate){
        var aD = sDate.split('-');
        for(var i = 0; i < aD.length; i++){
            aD[i] = fixZero(parseInt(aD[i]));
        }
        return aD.join('-');
    };
    var fixZero = function(n){
        return n < 10 ? '0'+n : n;
    };
    var fixInt = function(a){
        for(var i = 0; i < a.length; i++){
            a[i] = parseInt(a[i]);
        }
        return a;
    };
    var getMonthDays = function(y,m){
        var aMonthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31];
        if((y%400 == 0) || (y%4==0 && y%100!=0)){
            aMonthDays[2] = 29;
        }
        return aMonthDays[m];
    };
    var checkDate = function(sDate){
    };
    var y = 0;
    var m = 0;
    var d = 0;
    var sTmp;
    var aTmp;
    sDate1 = fixDate(sDate1);
    sDate2 = fixDate(sDate2);
    if(sDate1 > sDate2){
        sTmp = sDate2;
        sDate2 = sDate1;
        sDate1 = sTmp;
    }
    var aDate1 = sDate1.split('-');
        aDate1 = fixInt(aDate1);
    var aDate2 = sDate2.split('-');
        aDate2 = fixInt(aDate2);
    //计算相差的年份
    /*aTmp = [aDate1[0]+1,fixZero(aDate1[1]),fixZero(aDate1[2])];
    while(aTmp.join('-') <= sDate2){
        y++;
        aTmp[0]++;
    }*/
    y = aDate2[0] - aDate1[0];
    if( sDate2.replace(aDate2[0],'') < sDate1.replace(aDate1[0],'')){
        y = y - 1;
    }
    //计算月份
    aTmp = [aDate1[0]+y,aDate1[1],fixZero(aDate1[2])];
    while(true){
        if(aTmp[1] == 12){
            aTmp[0]++;
            aTmp[1] = 1;
        }else{
            aTmp[1]++;
        }
        if(([aTmp[0],fixZero(aTmp[1]),aTmp[2]]).join('-') <= sDate2){
            m++;
        } else {
            break;
        }
    }
    //计算天数
    aTmp = [aDate1[0]+y,aDate1[1]+m,aDate1[2]];
    if(aTmp[1] > 12){
        aTmp[0]++;
        aTmp[1] -= 12;
    }
    while(true){
        if(aTmp[2] == getMonthDays(aTmp[0],aTmp[1])){
            aTmp[1]++;
            aTmp[2] = 1;
        } else {
            aTmp[2]++;
        }
        sTmp = ([aTmp[0],fixZero(aTmp[1]),fixZero(aTmp[2])]).join('-');
        if(sTmp <= sDate2){
            d++;
        } else {
            break;
        }
    }
    return {y:y,m:m,d:d};
};

var aTest = [
    ['1984-9-17','2015-8-15'],
    ['1984-9-17','1985-9-18'],
    ['1984-9-17','1984-10-17'],
    ['1984-9-17','1984-10-10'],
];
for(var i = 0; i < aTest.length; i++){
    console.log(aTest[i][0]+':'+aTest[i][1]);
    console.log(getDiffYmdBetweenDate(aTest[i][0],aTest[i][1]));
}

代码引用: http://www.itkeyword.com/doc/...

这个东西看你这么认为了。

你是想要 1年2个月3天这种的。还是想要 一年 14个月 4天**。

这个东西没有一个标准算法。如果你有你心中的逻辑,按逻辑一点一点写出来。

可以发出来让别人帮你优化,抖机灵什么的。还能看看输入输出一样不。

我的想法是年-年,然后看看时间大还是小,小的话,减去-1,大的话不动

`20180901` `20170902` 这种就是`0年`
`20180902` `20170901` 这种就是`1年`

月-月,看看时间是大是小,这个也要看时间再去处理

`20180901` `20171002` 这种就是`0年10月`
`20180801` `20171001` 这种就是`0年10月`
`20180901` `20171001` 这种就是`0年11月`
`20181001` `20171001` 这种就是`1年0月`
`20180902` `20170901` 这种就是`1年0月`

天数当然也是同样的道理

把两个日期转成时间戳,然后减一下不就好了?

安利一下时间工具

momentjs 感觉相当好用....

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题