JS计算两日期相差年月日

有时候需要用到二个日期相差几年几月几日,直接把年月日相差的时候会出现负数的情况。这个时间就和我们做数这减法一样,向高位去借。但这里和数字不同的是,借来的值不是固定的,比如一月有31天,正常2月是28天,闰年2月是29天。把这些情况考虑一下得出的代码

function diffDate(date1, date2) {
    let begin = new Date(date1);
    let end = new Date(date2);

    // 如果开始时间晚于结束时间,交换日期,并记录交换状态
    let swap = false;
    if (begin > end) {
        let tmp = begin;
        begin = end;
        end = tmp;
        swap = true;
    }

    // 分别取二个日期的年、月、日值
    let d1 = begin.getDate();
    let m1 = begin.getMonth() + 1;
    let y1 = begin.getFullYear();
    let d2 = end.getDate();
    let m2 = end.getMonth() + 1;
    let y2 = end.getFullYear();

    // 获取每个月的天数,这里要注意一下闰年的2月
    var getMonthDays = function (y, m) {
        var aMonthDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if (m == 2 && ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0))) {
            return 29;
        }
        return aMonthDays[m];
    };

    let y, m, d
    let tempD = 0
    let tmpM = 0
    let tmpY = 0

    // 计算日,不足时向月份借
    if (d2 >= d1) {
        d = d2 - d1
    } else {
        tmpM = -1
        d = getMonthDays(y1, m1) + d2 - d1
    }

    // 计算月,不足时向年份借
    if (m2 + tmpM >= m1) {
        m = m2 + tmpM - m1
    } else {
        tmpY = -1
        m = 12 + m2 + tmpM - m1
    }

    // 计算年
    y = y2 + tmpY - y1

    // 拼接距离字符串 输出格式如:"5天", "5月 05天", "5年 05月 05日"
    let str = "";
    if (y > 0) {
        str = y + '年 ' + ("0" + m).substr(-2) + "月 " + ("0" + d).substr(-2) + '天 '
    } else if (m > 0) {
        str = m + "月 " + ("0" + d).substr(-2) + '天 '
    } else if (d > 0) {
        str = d + '天 '
    }

    // 完整输出
    return date1 + " 比 " + date2 + (swap ? " 晚 " : " 早 ") + str;
}

测试

// 输出:1988-09-04 比 2020-03-08 早 31年 06月 04天 
console.log(diffDate("1988-09-04","2020-03-08"));

// 输出:2020-02-02 比 2011-11-02 晚 8年 03月 00天 
console.log(diffDate("2020-02-02","2011-11-02"));
0%