JavaScript 中两个日期之间的月份差异

2022-08-30 01:19:28

我如何计算出JavaScript中两个Date()对象的差异,同时只返回差异中的月数?

任何帮助都会很棒:)


答案 1

“差异中的月数”的定义受到很多解释。:-)

您可以从 JavaScript 日期对象获取年、月和月日。根据您要查找的信息,您可以使用这些信息来确定两个时间点之间有多少个月。

例如,即兴演奏:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

function test(d1, d2) {
    var diff = monthDiff(d1, d2);
    console.log(
        d1.toISOString().substring(0, 10),
        "to",
        d2.toISOString().substring(0, 10),
        ":",
        diff
    );
}

test(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16

test(
    new Date(2010, 0, 1),  // January 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 2

test(
    new Date(2010, 1, 1),  // February 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 1

(请注意,JavaScript 中的月份值以 0 = January 开头。

在上面包括小数月份要复杂得多,因为典型的二月中的三天(约10.714%)比八月的三天(约9.677%)大,当然,即使是二月也是一个移动目标,这取决于它是否是闰年。

还有一些日期和时间可用于JavaScript,可能会使这种事情变得更容易。


注意:上面曾经有一个,这里:+ 1

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

那是因为最初我说:

...这找出两个日期之间有多少个完整的月份,不计算部分月份(例如,不包括每个日期所在的月份)。

我删除它有两个原因:

  1. 不计算部分月份,结果证明不是许多(大多数?)人想要的答案,所以我认为我应该把它们分开。

  2. 即使按照这个定义,它也并不总是有效。:-D(抱歉。


答案 2

如果您不考虑月份中的某一天,这是迄今为止更简单的解决方案

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

请注意,月份索引从 0 开始。这意味着 和 。January = 0December = 11