JavaScript Tips | 日付・時間ユーティリティ:日付比較

JavaScript JavaScript
スポンサーリンク
スポンサーリンク

日付比較は「2つの日時の前後・一致を正しく判定する技術」

日付・時間ユーティリティの中でも 日付比較(date comparison)は、業務システムで非常に重要な処理です。 予約システム、期限チェック、締め日判定、レポート生成、ログの並び替えなど、 「A の日付は B より前か?後か?同じ日か?」という判定はあらゆる場面で登場します。

しかし、JavaScript の Date オブジェクトは参照型であり、 初心者がやりがちな === 比較が正しく動かないなどの落とし穴があります。 また、日付比較は 時刻を含めるかどうかでロジックが大きく変わります。

ここでは、日付比較の基本から、実務で使えるテンプレートまでを 例題・コードを交えて丁寧に解説します。

Date オブジェクトは「ミリ秒の数値」として比較するのが基本

JavaScript の Date は内部的に 1970年1月1日からのミリ秒数(タイムスタンプ)を保持しています。 そのため、日付比較は次のように 数値として比較するのが最も安全です。

const a = new Date("2026-05-01T10:00:00");
const b = new Date("2026-05-01T15:00:00");

if (a.getTime() < b.getTime()) {
  console.log("a は b より前の日付です");
}
JavaScript

この方法は、複数の信頼できる技術記事でも推奨されています。

なぜ getTime() が必要なのか(重要ポイント)

Date はオブジェクトなので、次の比較は 必ず false になります。

new Date("2026-05-01") === new Date("2026-05-01"); // false
JavaScript

理由は「参照が違うため」であり、 日時が同じかどうかは getTime() で比較する必要があります

比較演算子(<, >)は使ってもよいが「内部で数値化されている」

実は次のような比較も可能です。

if (a < b) {
  console.log("a は b より前です");
}
JavaScript

これは比較演算子が内部で valueOf() を呼び出し、 タイムスタンプに変換しているためです。

ただし、明示的に getTime() を使う方が安全で読みやすいため、 業務コードでは getTime() を推奨します。

「同じ日かどうか」を比較する方法(時刻を無視する)

業務では「同じ日付かどうか」だけを判定したい場面が非常に多いです。

例:

  • 締め日が同じか
  • イベントの日付が一致しているか
  • 日付だけでソートしたい

方法1:時刻を 00:00:00 に揃えて比較する(最も確実)

function isSameDate(a, b) {
  const d1 = new Date(a);
  const d2 = new Date(b);

  d1.setHours(0, 0, 0, 0);
  d2.setHours(0, 0, 0, 0);

  return d1.getTime() === d2.getTime();
}

console.log(isSameDate("2026-10-10T15:30:00", "2026-10-10T09:00:00")); // true
JavaScript

この方法は複数の技術記事でも紹介されている標準的な手法です。

方法2:年月日を個別に比較する(読みやすい)

function isSameYmd(a, b) {
  const d1 = new Date(a);
  const d2 = new Date(b);

  return (
    d1.getFullYear() === d2.getFullYear() &&
    d1.getMonth() === d2.getMonth() &&
    d1.getDate() === d2.getDate()
  );
}
JavaScript

この方法は「時刻を無視したい」場面でよく使われます。

日付比較ユーティリティ(業務で使えるテンプレート)

実務では、次のようなユーティリティをまとめておくと便利です。

export const DateCompareUtil = {
  // A < B ?
  isBefore(a, b) {
    return new Date(a).getTime() < new Date(b).getTime();
  },

  // A > B ?
  isAfter(a, b) {
    return new Date(a).getTime() > new Date(b).getTime();
  },

  // A と B が完全に同じ日時か?
  isEqual(a, b) {
    return new Date(a).getTime() === new Date(b).getTime();
  },

  // 年月日だけ比較(時刻無視)
  isSameDate(a, b) {
    const d1 = new Date(a);
    const d2 = new Date(b);
    return (
      d1.getFullYear() === d2.getFullYear() &&
      d1.getMonth() === d2.getMonth() &&
      d1.getDate() === d2.getDate()
    );
  },

  // A が B 以上か(締め日判定など)
  isOnOrAfter(a, b) {
    return new Date(a).getTime() >= new Date(b).getTime();
  },

  // A が B 以下か
  isOnOrBefore(a, b) {
    return new Date(a).getTime() <= new Date(b).getTime();
  },
};
JavaScript

使い方は次の通りです。

import { DateCompareUtil } from "./DateCompareUtil.js";

console.log(DateCompareUtil.isBefore("2026-05-01", "2026-05-02")); // true
console.log(DateCompareUtil.isSameDate("2026-05-01T10:00", "2026-05-01T20:00")); // true
console.log(DateCompareUtil.isOnOrAfter("2026-05-03", "2026-05-01")); // true
JavaScript

日付比較の“実務での落とし穴”を深掘りする

1. === では比較できない(参照型だから)

new Date("2026-05-01") === new Date("2026-05-01"); // false
JavaScript

これは複数の技術記事でも指摘されている典型的な罠です。

2. 日付文字列の形式によって結果が変わる

new Date("2026/05/01"); // Safari で失敗する可能性あり
JavaScript

非標準形式はブラウザ差異が出るため、 ISO 形式(YYYY-MM-DD)か手動パースを使うのが安全です。

3. 時刻を含むかどうかで比較結果が変わる

"2026-05-01T00:00""2026-05-01T23:59"
JavaScript

同じ日付でも getTime() では「違う」と判定されます。 「日付だけ比較したい」場合は、時刻をリセットする必要があります。

日付比較を使った実務テンプレート

締め日チェック(例:今日が締め日以降か?)

function isAfterClosing(today, closingDate) {
  return DateCompareUtil.isOnOrAfter(today, closingDate);
}

console.log(isAfterClosing("2026-05-03", "2026-05-01")); // true
JavaScript

イベントが今日かどうか判定する

function isEventToday(eventDate) {
  return DateCompareUtil.isSameDate(eventDate, new Date());
}
JavaScript

日付の昇順ソート

function sortByDate(list) {
  return list.sort((a, b) => new Date(a).getTime() - new Date(b).getTime());
}
JavaScript

まとめ:日付比較は「ミリ秒比較」と「時刻を含むかどうか」が鍵

日付比較を正しく扱うためのポイントは次の通りです。

  • Date はオブジェクトなので === 比較はできない
  • getTime() でミリ秒に変換して比較するのが基本
  • 比較演算子(<, >)も内部で数値化されるため使える
  • 「同じ日付かどうか」は時刻をリセットするか年月日を比較する
  • 非標準形式の日付文字列はブラウザ差異が出るので注意
  • 業務ではユーティリティ化して再利用するのが最も安全

日付比較は単純に見えて、実は多くの落とし穴があります。 しかし、正しいユーティリティを用意しておけば、 どの場面でも安定した判定ができるようになります。

業務システムの品質を支える重要な基盤として、 ぜひ日付比較ユーティリティを活用してください。

タイトルとURLをコピーしました