PHPで日付を比較する方法!比較演算子・strtotime()・DateTimeクラスの使い分けを解説
PHPで2つの日付を比較する場合、両方の日付が同じ形式であればシンプルな記述で済みますが、形式が異なる場合はそのまま比較できません。本記事では、PHPにおける日付比較の代表的な3つのケースを取り上げ、比較演算子、strtotime()関数、DateTimeクラスを使った比較方法をサンプルコードとともに解説します。
ケース1:同じ形式の日付を比較演算子で比較する
「YYYY-MM-DD」のように2つの日付が同じ形式であれば、文字列のまま比較演算子(> や <)を使って直接比較できます。
<?php
$date1 = "2018-11-24";
$date2 = "2019-03-26";
if ($date1 > $date2)
echo "$date1 の方が $date2 より新しいです";
else
echo "$date1 は $date2 より古い日付です";
?>
出力結果:
2018-11-24 は 2019-03-26 より古い日付です
解説:
$date1 と $date2 という2つの日付を同じ形式で定義し、比較演算子(>)で新旧を判定しています。「YYYY-MM-DD」形式は文字列の順序と時系列が一致するため、文字列比較でも正しい結果が得られます。
ケース2:形式が異なる日付をstrtotime()で比較する
日付の形式が異なる場合は、strtotime()関数でそれぞれUNIXタイムスタンプ(数値)に変換してから比較します。数値同士の比較により、どちらが新しい日付かを正確に判定できます。
サンプルコード:
<?php
$date1 = "18-03-22";
$date2 = "2017-08-24";
$curtimestamp1 = strtotime($date1);
$curtimestamp2 = strtotime($date2);
if ($curtimestamp1 > $curtimestamp2)
echo "$date1 の方が $date2 より新しいです";
else
echo "$date1 は $date2 より古い日付です";
?>
出力結果:
18-03-22 の方が 2017-08-24 より新しいです
解説:
この例では、「18-03-22」と「2017-08-24」という異なる形式の日付を扱っています。strtotime()関数で双方をUNIXタイムスタンプに変換し、数値として比較することで期待通りの結果を得られます。なお、strtotime()は解析できない文字列に対してはfalseを返すため、変換結果をチェックしておくとより安全なコードになります。
ケース3:DateTimeクラスのオブジェクトで比較する
DateTimeクラスのインスタンスを生成すると、オブジェクト同士を比較演算子で直接比較できます。日付の加減算や書式変更なども併せて行いたい場合に便利な方法です。
サンプルコード:
<?php
$date1 = new DateTime("18-02-24");
$date2 = new DateTime("2019-03-24");
if ($date1 > $date2) {
echo 'datetime1はdatetime2より大きい';
}
if ($date1 < $date2) {
echo 'datetime1はdatetime2より小さい';
}
if ($date1 == $date2) {
echo 'datetime1とdatetime2は等しい';
}
?>
出力結果:
datetime1はdatetime2より小さい
解説:
この例では、2つのDateTimeオブジェクトを生成し、比較演算子(>、<、==)によって日付の前後関係を判定しています。DateTimeオブジェクトは比較演算子による直接比較に対応しているため、タイムスタンプへの変換なしに直感的に記述できるのが魅力です。
まとめ
PHPで日付を比較する際は、状況に応じて方法を使い分けることが重要です。
- 同じ形式の日付(YYYY-MM-DDなど):比較演算子でそのまま比較できる
- 形式が異なる日付:strtotime()でUNIXタイムスタンプに変換してから比較する
- 日付計算も行いたい場合:DateTimeクラスのオブジェクトを利用する
実務では、ユーザー入力や外部APIから取得する日付の形式は一定とは限りません。DateTime::createFromFormat()などのメソッドを活用すれば、任意の形式の日付を安全に解析できるため、あわせて覚えておくとよいでしょう。
-
PHPで浮動小数点数を比較する際の落とし穴と正しい比較方法
PHPでは、浮動小数点数が等しいかどうかを「==」演算子で直接比較すると、直感に反する結果になることがあります。見た目上は同じ値に見える浮動小数点数でも、コンピュータ内部での表現方法の違いにより、実際には完全に同一の値ではない場合があるためです。本記事では、浮動小数点数の比較で発生する問題を具体例とともに解説し、この問題を回避するための実践的な手法を紹介します。問題の例まず、シンプルな例でこの問題を確認してみましょう。<?php $a = 0.14; $b = 1 - 0.86; // 0.14 if($a =
-
PHPの&&演算子とAND演算子の違いとは?優先順位による挙動の差を徹底解説
PHPには、算術演算、代入、比較など、さまざまな処理を行うための多彩な演算子が用意されています。本記事では、論理演算子「&&」と「AND」に焦点を当て、それぞれの優先順位がもたらす挙動の違いを中心に詳しく解説します。これらの論理演算子は結果として真(true)か偽(false)を返すため、「ブール演算子」と呼ばれることもあります。 「AND」演算子とは 「AND」演算子は、両方の条件がtrueである場合にのみtrueを返す演算子です。まずは基本的な動作を、以下の例で確認してみましょう。 サンプルコード1 <?php $val1 = 20; $val2 = 50; i