JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで2つの日付間の日数を計算する方法

本記事では、「YYYY-MM-DD」形式の文字列で与えられた2つの日付を受け取り、その間の日数を計算して返すJavaScript関数の作成方法を解説します。うるう年も正確に考慮した実装となっているため、任意の期間に対して信頼性の高い結果が得られます。

要件の確認

作成する関数は、第1引数と第2引数にそれぞれ「YYYY-MM-DD」形式の日付文字列を受け取り、2つの日付の間の日数を数値として返す必要があります。

例えば、入力が以下の場合を考えてみましょう。

const str1 = '2020-05-21';
const str2 = '2020-05-25';

この場合、2020年5月21日から5月25日までの差は4日なので、期待される出力は次のとおりです。

const output = 4;

実装コード

以下が、実際に動作するサンプルコードです。

const str1 = '2020-05-21';
const str2 = '2020-05-25';

const daysBetweenDates = (str1, str2) => {
    // 指定日までに含まれるうるう年の回数を求める
    const leapYears = (year, month) => {
        if (month <= 2){
            --year;
        };
        let floor = Math.floor;
        return floor(year / 400) + floor(year / 4) - floor(year / 100);
    };
    // 各月の累積日数テーブルを作成
    let monthDays = [0, 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30];
    for (let i = 1; i < monthDays.length; ++i){
        monthDays[i] += monthDays[i - 1];
    };
    // 日付を「基準日からの総日数」に変換する
    let days = (year, month, d) => (year * 365) + leapYears(year, month) + monthDays[month] + d;
    let p = days(...str1.split('-').map(Number));
    let q = days(...str2.split('-').map(Number));
    // 総日数の差の絶対値が、2つの日付の間の日数となる
    return Math.abs(p - q);
};
console.log(daysBetweenDates(str1, str2));

出力結果

コンソールには以下のように表示されます。

4

コードの仕組み

このアルゴリズムのポイントは、各日付を「西暦0年からの経過総日数」に変換し、その差を取る点にあります。

leapYears関数は、指定された年までに存在するうるう年の回数を計算します。4で割り切れる年を加算し、100で割り切れる年を減算、さらに400で割り切れる年を加算することで、グレゴリオ暦の規則に正確に対応しています。また、月が2月以前の場合はまだ閏日(2月29日)が到来していないため、前年の値を基準に補正しています。

monthDays配列は、ループ処理によって各月の累積日数に変換されます。これにより、月ごとの日数の違い(28日・30日・31日)を簡単に扱えるようになります。

days関数は、年数×365日にうるう年の補正と月の累積日数、日を加算して総日数を算出します。最後にMath.abs()で差の絶対値を返すことで、引数の順序に関係なく常に正の値が得られる仕組みです。

まとめ

Dateオブジェクトを使わずに純粋な計算だけで日数差を求めるこの手法は、タイムゾーンの影響を受けず、ロジックの理解にも役立ちます。日付計算の内部動作を学びたい方や、軽量な実装を求めている場合におすすめのアプローチです。

  1. Pythonで2つの日付の間の日数を求める方法

    2つの日付の間の日数を求めるには、Pythonの標準ライブラリである datetime モジュールを使用します。datetime モジュールには日付を扱うための date クラスが用意されており、dateオブジェクト同士を減算すると、その差が timedelta オブジェクトとして返されます。このオブジェクトの days 属性を参照することで、日数を簡単に取得できます。手順1:必要なライブラリをインポートするまず、datetime モジュールから date クラスをインポートします。from datetime import date手順2:dateオブジェクトを作成する次に、日数を計算したい2

  2. Pythonで2つの日付の間の日数を計算する方法を解説

    Pythonでは、シンプルな日付演算を使うことで、2つの日付の間の日数を簡単に計算できます。日数の差を求めたい2つの日付を定義し、それらを引き算すると timedelta オブジェクトが得られます。このオブジェクトの days プロパティを参照することで、目的の日数を取得できます。基本的な手順datetime モジュールから date クラスをインポートします。差を求めたい2つの日付を date オブジェクトとして定義します。2つの日付を引き算して timedelta オブジェクトを生成します。days プロパティの値を出力します。サンプルコードfrom datetime import dat