PHPで日付を比較する方法【初心者向け】

初心者向けにPHPで日付を比較する方法について解説しています。DateTimeクラスを利用して日付を操作してみましょう。strtotime( )の使い方も説明しています。実際にソースコードを書きながら理解していきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

PHPで日付を比較する方法について解説します。

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのPythonオンライン講座の内容をもとにしています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PHPで日付を比較する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

日付の比較で注意すること

PHPでは日付を比較する方法はいくつかあります。

今回はPHPにデフォルトで備わっている機能に限定して推奨されている順に紹介していきます。

 

1「DateTimeクラス」を利用した比較

PHPバージョン5.2以降を利用されている場合は、DateTimeクラスを利用した方法が推奨されています。

DateTimeクラスはPHPバージョン5.2で導入された機能になり、5.1以前のバージョンでは利用できません。

DateTimeクラスでは日付の比較(過去・未来・一致)に加えて、差分を算出することができ、「年/月/時/分/秒」など柔軟な単位で出力できるので便利です。

 

2「strtotime( )関数」を利用した比較

PHPバージョン5.1以前である場合は、上記のDateTimeクラスが利用できないのでstrtotime( )を使った比較を行うのが一般的です。
strtotime( )は引数に「2018-09-01」などの文字列をとり、文字列の日付からUNIXタイムスタンプに変換します。

UNIXタイムスタンプとは簡単言うと、1970年1月1日00:00:00秒からの経過秒数になります。

そのためstrtotime( )では取得できた数値(秒数)同士を比較する方法になります。

ただ、PHPを実行するサーバのOSが32bitだった場合はstrtotime( )は2038年問題の影響を受けることが予測されています。そのため、strtotime( )を使った比較はあまり推奨されておりませんが、OSが64bitである場合は問題はありません。

2038年問題とstrtotime( )の関連については、調べていただくと詳細に説明している記事が出てくるのでここでは割愛させていただきますね。

選択肢としては基本は「DateTimeクラス」を使うようにして、PHPのバージョンが古くて1が利用できない場合には「strtotime( )関数」を使うようにしましょう。

2を利用する際はOSが32bitである場合には2038年問題の影響を考慮して、PHPのバージョンを上げて「DateTimeクラス」を利用できる環境にするかなど対策を考えましょう。

 

実際に書いてみよう

1. DateTimeクラスを利用して日付を比較してみましょう!

$date1 = new DateTime('2017-01-01');
$date2 = new DateTime('2018-01-02');
$date3 = new DateTime('2017/01/01');
$date4 = new DateTime('2017/01/01 12:00:00');
$date5 = new DateTime('2017/01/01 13:45:00');

// 「古い日付が小、新たしい日付が大」と判断されます
if($date1 < $date2) {
    echo "date2の方が新しい日付である".PHP_EOL;
}

// DateTimeに渡す日付書式が異なっても同じ日付であるなら同値となります
if($date1 == $date3) {
    echo "date1とdate3は同じ日付である".PHP_EOL;
}

 

2. DateTimeクラスを利用して差分を出してみましょう!

$interval = $date1->diff($date2);
echo $interval->format("%R%a days").PHP_EOL;    // +366 days
$interval = $date4->diff($date5);
echo $interval->format("%R%H:%I:%S").PHP_EOL;    // +01:45:00

3. strtotime( )を利用して日付を比較してみましょう!

$unixtime1 = strtotime('2018-01-01');
$unixtime2 = strtotime('2018-01-02');
$unixtime3 = strtotime('2018-01-01 01:00:00');
$unixtime4 = strtotime('2018-01-01 01:00:01');

// 1970年1月1日00:00:00秒からの経過秒数の比較になるので、「2018-01-02」が大と判断されます
// 年月日を指定して比較
if ($unixtime1 < $unixtime2) {
    echo '$unixtime1: '.$unixtime1 .PHP_EOL;    // $unixtime1: 1514764800
    echo '$unixtime2: '.$unixtime2 .PHP_EOL;    // $unixtime2: 1514851200
}
// 年月日時分秒を指定して比較
if ($unixtime3 < $unixtime4) {
    echo '$unixtime3: '.$unixtime3 .PHP_EOL;    // $unixtime3: 1514768400
    echo '$unixtime4: '.$unixtime4 .PHP_EOL;    // $unixtime4: 1514768401
}

 

補足事項

format( )の引数については下記を参考にしてください。

php.net-format

この記事を監修してくれた方

青木 敦史(あおきあつし)
昼間は自社のWebサービスを運営している会社でフロントエンド/バックエンドを担当しているエンジニア。

Webエンジニアの経験は5年ほどです。TechAcademyではPHP/Laravelコースを担当しています。
開発実績: メイクレッスン支援アプリ / 電力自由化パッケージ / 携帯電話料金計算 / ライブチャットサービス

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

オンラインのプログラミングスクールTechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

PHPやフレームワークのLaravelを使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。