日付比較は「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() でミリ秒に変換して比較するのが基本
- 比較演算子(<, >)も内部で数値化されるため使える
- 「同じ日付かどうか」は時刻をリセットするか年月日を比較する
- 非標準形式の日付文字列はブラウザ差異が出るので注意
- 業務ではユーティリティ化して再利用するのが最も安全
日付比較は単純に見えて、実は多くの落とし穴があります。 しかし、正しいユーティリティを用意しておけば、 どの場面でも安定した判定ができるようになります。
業務システムの品質を支える重要な基盤として、 ぜひ日付比較ユーティリティを活用してください。

