1. ホーム
  2. javascript

[解決済み] JavaScriptで2つの日付の月数の違い

2022-04-15 10:28:40

質問

JavaScriptで2つのDate()オブジェクトの差を計算し、差の月数だけを返すにはどうしたらよいでしょうか?

何かお手伝いいただけると助かります :)

解決方法は?

差分月数の定義は、いろいろと解釈が分かれるところです :-)

JavaScriptのdateオブジェクトから年、月、日を取得することができます。どのような情報を求めているかにもよりますが、それらを使って2つの時点の間に何ヶ月あるのかを把握することができます。

例えば、オフザケ。

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=1月から始まることに注意してください)。

なぜなら、一般的な2月の3日間は、8月の3日間(~9.677%)よりもその月の割合が大きい(~10.714%)からです。もちろん、2月でさえ、うるう年かどうかによって変動します。

また、いくつかの 日付と時刻のライブラリ JavaScriptでは、おそらくこのようなことが簡単にできるようになります。


備考 : 以前は + 1 を上記の、ここに。

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

それは、もともと私が言っていたことだからです。

...これは 満月 2つの日付の間にある月(例えば、それぞれの日付が属する月を除く)は、部分月としてカウントされません。

2つの理由で削除しました。

  1. 部分月数のカウントをしないことは、回答に来ている多くの(ほとんどの?)人が望んでいないことがわかったので、分けて考えるべきだと思いました。

  2. その定義でもうまくいかないことがありました :-D (すみません。)