Webアプリケーション開発において、「キャンペーン期間中かどうかを判定する」「締め切り日が過ぎているかチェックする」といった日付や時間の比較は避けて通れない処理です。
PHPには日付を扱う方法はいくつかありますが、現在主流となっているのが DateTime クラス(または DateTimeImmutable クラス)を利用する方法です。
DateTime クラスを使うことで、より直感的でバグの少ないコードを書くことができます。この記事では、PHPの DateTime オブジェクトを使った日付・時間の比較方法について、基本的な演算子の使い方から、詳細な差分を取得する diff メソッド、そして「日付のみ」を比較する応用テクニックまでを徹底解説します。
![]() 執筆者:マヒロ |
|
DateTimeオブジェクト同士を比較演算子で比較する
PHPの DateTime クラスの最大の利点は、比較演算子を使って数値と同じように大小比較ができる点です。
わざわざタイムスタンプ(UNIX時間)に変換する必要はありません。
直感的に「どちらが未来か、過去か」を判定できます。
比較演算子(<, >, ==)を使った大小比較
数値の比較と同じように、>(大なり)、<(小なり)、==(等しい)などの演算子がそのまま使えます。
$date1 > $date2:$date1の方が未来(新しい)$date1 < $date2:$date1の方が過去(古い)$date1 == $date2: 全く同じ日時
<?php
// 2つのDateTimeオブジェクトを作成
$date1 = new DateTime('2025-01-01 10:00:00');
$date2 = new DateTime('2025-01-02 10:00:00');
$date3 = new DateTime('2025-01-01 10:00:00');
// 未来かどうかの判定
if ($date2 > $date1) {
echo '$date2 は $date1 より未来です。' . "\n";
}
// 過去かどうかの判定
if ($date1 < $date2) {
echo '$date1 は $date2 より過去です。' . "\n";
}
// 等しいかどうかの判定
if ($date1 == $date3) {
echo '$date1 と $date3 は同じ日時です。' . "\n";
} else {
echo '$date1 と $date3 は異なります。' . "\n";
}
?>
実行結果
$date2 は $date1 より未来です。
$date1 は $date2 より過去です。
$date1 と $date3 は同じ日時です。
ソースコードの解説
上記のコードでは、new DateTime() で日付オブジェクトを生成し、if 文の中で直接比較しています。
$date2(1月2日)は $date1(1月1日)よりも後の日付であるため、$date2 > $date1 は true となり、メッセージが表示されます。
== による比較では、保持している「日時(マイクロ秒含む)」と「タイムゾーン」が一致していれば等しいとみなされます。
差分(期間)を計算して詳細に比較する diff メソッド
単に「どっちが新しいか」だけでなく、「何日離れているか」「何時間違うか」といった差分を知りたい場合は、diff メソッドを使用します。
このメソッドは、2つの日付の差を表す DateInterval オブジェクトを返します。
diffメソッドの使い方とDateIntervalオブジェクト
diff メソッドで取得した DateInterval オブジェクトには、年、月、日、時間などの差分情報が格納されています。
<?php
$start = new DateTime('2025-01-01 00:00:00');
$target = new DateTime('2025-01-03 12:30:00');
// 差分を計算($start から見た $target への差分)
$interval = $start->diff($target);
// 差分を表示
echo "差分: " . $interval->format('%a 日間') . "\n";
echo "詳細: " . $interval->format('%y年 %mヶ月 %d日 %h時間 %i分') . "\n";
// どちらが過去/未来かを判定
if ($interval->invert === 1) {
echo '$target は $start よりも過去です。';
} else {
echo '$target は $start よりも未来です。';
}
?>
実行結果
差分: 2 日間
詳細: 0年 0ヶ月 2日 12時間 30分
$target は $start よりも未来です。
ソースコードの解説
$start->diff($target) を実行することで、2つの日付の差分情報を持つ DateInterval オブジェクトが $interval に格納されます。
$interval->format() メソッドを使うと、指定したフォーマットで差分を文字列として取得できます。
%a は総日数を表す特別なフォーマット文字です。
また、重要なのが $interval->invert プロパティです。
これは、引数で渡した日付($target)が、元の日付($start)より過去の場合は 1、未来の場合は 0 になります。
これにより、日数の差だけでなく前後関係も把握できます。
「日付のみ(時間は無視)」で比較したい場合
DateTime クラスはデフォルトで「時・分・秒」まで厳密に比較します。
しかし、実務では「時間は関係なく、同じ日付かどうかだけを知りたい」というケースが多々あります。
そのような場合の対処法を2つ紹介します。
1. formatメソッドで文字列にして比較する
最も簡単で分かりやすいのが、format('Y-m-d') を使って「日付部分だけの文字列」に変換してから比較する方法です。
<?php
$dt1 = new DateTime('2025-05-10 09:00:00');
$dt2 = new DateTime('2025-05-10 23:59:59');
// そのまま比較すると時間が違うので false になる
if ($dt1 == $dt2) {
echo "そのまま比較: 同じです\n";
} else {
echo "そのまま比較: 違います\n";
}
// format で日付文字列にして比較
if ($dt1->format('Y-m-d') === $dt2->format('Y-m-d')) {
echo "日付のみ比較: 同じ日です\n";
}
?>
実行結果
そのまま比較: 違います
日付のみ比較: 同じ日です
ソースコードの解説
format('Y-m-d') を使うと、両方とも "2025-05-10" という文字列になります。
文字列同士の比較であれば、時間が異なっていても「同じ文字列」となるため、日付としての一致判定が可能になります。
シンプルで可読性が高い推奨される方法です。
2. setTimeメソッドで時刻を00:00:00に揃える
もう一つの方法は、setTime(0, 0, 0) を使って、比較するオブジェクトの時刻を強制的に0時にリセットすることです。
ただし、DateTime オブジェクト自体が変更されてしまう点に注意が必要です(元の時間を保持したい場合は clone するか DateTimeImmutable を使います)。
<?php
$dt1 = new DateTime('2025-05-10 15:30:00');
$dt2 = new DateTime('2025-05-10 08:45:00');
// 時刻を 00:00:00 にリセット
$dt1->setTime(0, 0, 0);
$dt2->setTime(0, 0, 0);
if ($dt1 == $dt2) {
echo "時刻リセット後: 同じ日時になりました";
}
?>
ソースコードの解説
setTime メソッドで両方のオブジェクトを「2025-05-10 00:00:00」の状態に変更しました。
これにより、純粋に日付部分だけの比較と同じ結果が得られます。
比較後にオブジェクトを再利用する場合は、データが変わってしまっていることに十分注意してください。
日付が「特定の範囲内」にあるかチェックする
「キャンペーン期間中(開始日〜終了日)かどうか」といった判定も、比較演算子を組み合わせることで簡単に実装できます。
範囲内チェックのコード例
<?php
$start = new DateTime('2025-01-01');
$end = new DateTime('2025-01-31');
$target = new DateTime('2025-01-15');
// $start 以上 かつ $end 以下
if ($target >= $start && $target <= $end) {
echo "期間内です!\n";
} else {
echo "期間外です...\n";
}
?>
実行結果
期間内です!
ソースコードの解説
数値の範囲チェックと同じように、論理積 &&(かつ)を使って条件を記述します。
$target >= $start で「開始日以降」を、$target <= $end で「終了日以前」を判定しています。
境界値(開始日や終了日当日)を含める場合は >= <= を、含めない場合は > < を使うなど、要件に合わせて演算子を使い分けましょう。
PHPのスキルを活かして年収を上げる方法
以上、PHPのDateTimeで日付・時間を比較する方法について解説してきました。
なお、PHPのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
PHPエンジニアの需要は非常に高く求人数・案件数も多いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPHPの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



