【PHP入門】日付を取得・比較する方法と注意点まとめ

こんにちは、エンジニアのオータケです!

皆さん日付を比較する時はどうしていますか?

この記事では

・date関数の使い方
・日付を取得するさまざまな方法
・strtotime関数を使って日時を比較する方法
・DateTimeクラスを使って日時を比較する方法

といった基本的な内容から

・strtotime関数を使って日時を比較することの問題点
・文字列同士を直接比較することの問題点

といった応用的な解説もします。

今回はそんな日付(date)の比較について、わかりやすく解説します!

目次

日付を扱う関数(date)

日付を扱う関数のひとつにdate関数があります。

date関数は指定された日時を任意の形式でフォーマットし、日付文字列を返す関数です。

書き方:

string date( string $$フォーマット文字列 [, int $UNIXタイムスタンプ = time() ] )

引数:
第一引数にフォーマット文字列を指定します。

第二引数を省略した場合は、現在日時が第一引数で指定した形式でフォーマットされます。

第二引数にUNIXタイムスタンプを指定した場合は、そのUNIXタイムスタンプがフォーマットされます。

UNIXタイムスタンプとは、1970年1月1日からの秒数です。

返り値:
日付を表す文字列を指定したフォーマットで返します。

以下のように記述すると、現在日付が「Y/m/d」の形式でフォーマットされた日付が取得できます。

$today = date('Y-m-d');
echo $today;

実行結果:

2017-09-26

今日の日付や現在時刻を取得する

現在の日付や時刻はdate関数以外にも日付関連のクラスや関数を使用することでも取得できます。

以下では現在日時をYYYY/MM/DD hh:mm:ssのフォーマットで取得します。

$today = date('Y/m/d H:i:s');
echo $today;  // 結果:2017/09/26 04:41:02

現在日時はDateTimeクラスのインスタンスからも取得できます。

$today = new DateTime();
echo $today->format('Y/m/d H:i:s');  // 結果:2017/09/26 13:46:14

現在日時をUNIXタイムスタンプで取得するにはtime関数を使用します。

$today = time();
echo $today;  // 結果:1506401270

現在日時をUNIXタイムスタンプでマイクロ秒単位で取得することもできます。

$today = microtime(true);
echo $today;  // 実行結果:1506401334.61

日付を比較する方法1(DateTime)

DateTimeクラス

まずDateTimeクラスで日付を比較する方法を説明します。

DateTimeクラスは日付・時間を扱うためのクラスです。

このDateTimeクラスはPHP5.2.0以降であれば使うことができます。

DateTimeクラスは以下のように日付を指定してインスタンスを生成します。

$date_time = new DateTime('2017-04-10');

作成したDateTimeクラスのオブジェクトからは、さまざまな日付に関する操作ができます。

また、DateTIme()の引数に日付を指定しない場合は、現在の日付のインスタンスを生成します。

サンプルプログラム:現在の日付から10日加算する

//10日加算する
$day = new DateTime();
$day->add(new DateInterval('P10D'));

echo $day->format('Y-m-d');

では実際にこのクラスを使って日時を比較し、一致しているかどうかを判定してみましょう。

サンプルプログラム:日付を比較する

$date_time1 = new DateTime('2017-04-20');
$date_time2 = new DateTime('2017-04-15');
 
if ($date_time1 == $date_time2){
  echo "同じです";
} else if ($date_time1 > $date_time2){
  echo "date_time1が未来です";
} else {
  echo "date_time2が未来です";
}

実行結果:

date_time1が未来です

このサンプルでは$date_time1や$date_time2といった変数にDateTimeのインスタンスが入っています。

インスタンスの生成時に日付を渡し、その後日付同士をif文で比較するといった流れになっています。

diffメソッド

先に紹介したDateTimeクラスでの日付の比較は、if文による比較演算子を使用して行いました。

DateTimeクラスを用いて日付を比較する際に、diffメソッドを使って日付の差分を出して比較する方法もあります。

サンプルプログラム

$datetime1 = new DateTime('2017-08-01');
$datetime2 = new DateTime('2017-08-15');

$interval = $datetime1->diff($datetime2);
echo $interval->d;

実行結果:

14

このようにdiffメソッドを使用すれば日付の差分が取得できます。

diffメソッドの詳しい使い方については次の記事で詳しく解説をしていますので、ぜひご覧ください!

日付を比較する方法2(strtotime)

strtotime関数

次に解説する方法はstrtotime関数を使う方法です。

strtotime関数は文字列をUnixタイムスタンプに変換してくれる関数です。

平たく言えば1970年1月1日00:00:00秒からの経過秒数を返してくれるという関数です。

早速コードを見てみましょう。

サンプルプログラム

$today = strtotime(date('Y-m-d'));
$target = strtotime('2017-04-10');
 
if ($today == $target){
  echo "targetは今日です";
} else if ($today > $target){
  echo "targetは過去です";
} else {
  echo "targetは未来です";
}

実行結果(2017-09-26に実行しています):

targetは過去です

上記の例では、date関数を使用して取得した現在日付と「2017-04-10」という日付の書式になっている文字列をstrtotime関数を使って秒に変換しています。

そしてif文を使って秒数が入った変数同士を比較しています。

日付を比較する上での注意点

日付を比較する上での注意点がいくつかあります。

この項目ではそれらを解説していきます。

strtotime関数を使うのはおすすめしない

先程、strtotime関数を使って秒に変換した値を比較することで一緒かどうか、またはどちらの日付が大きいかなどの判断ができると書きましたがこの方法はあまりオススメできません

というのも「2038年問題」があるからです。

2038年問題とは「2038年1月19日3時14分7秒」をすぎるとコンピュータが誤動作を起こすと言われている問題です。

Wikipedia – 2038年問題

懐かしい話で2000年問題というものがありましたが今度は2038年に問題が発生するといった話です。

社会にどの程度の影響をもたらすかはわかりませんがこういった問題がある以上、strtotimeを使うのはオススメできません

DateTimeクラスを使うべきでしょう。

ただし、PHPが稼働しているサーバーが32ビットOSである場合(PHPが32ビット版でビルドされている)、DateTimeクラスを使えば安全というわけではないので注意が必要です。

日付の文字列同士では比較しない

次に最も簡単で思いつきやすい方法なのですが文字列同士を直接比較して一緒かどうか等、判定するのはどうかという点です。

<?php
$date_time = '2017-04-10';
$date_time2 = '2017-04-10';
 
if($date_time == $date_time2)
{
    echo '同じですよ!';
}
else
{
    echo '一緒ではないんですね、これが。';
}
?>

このコードでは文字列同士をif文で比較しています。

そして実行結果は次のとおりになります。

実行結果:

同じですよ!

これでも比較できるじゃん!と思った貴方。この方法もあまりおすすめしません

例えば次のようなプログラムだった場合どうでしょうか。

<?php
$date_time = '2017-04-10';
$date_time2 = '2017/04/10';
 
if($date_time == $date_time2)
{
    echo '同じですよ!';
}
else
{
    echo '一緒ではないんですね、これが。';
}
?>

この場合、実行結果は「一緒ではないんですね、これが。」が表示されます。同じ日付であるのになぜこのような結果になるのでしょうか?

それは、このプログラムは日付を比較するためのプログラムではなく「一緒の文字列かどうか(値が同じかどうか)」を比較しているプログラムであるためです。

そのため二つの文字列は同じ日付ではあるもののコンピュータ上では「-」と「/」は別の文字列と認識するため同じにはなりません。

こういった点から文字列同士を直接比較するといった方法についてもあまりオススメできません。

やはりDateTimeクラスといった日付を扱うクラスを使い比較を行うのが良いのではないかと思います。

date関数についてもっと詳しく知りたい方へ

date関数を使用すれば日付を取得する以外にもさまざまな使い方があります。

date関数の使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

strtotime関数についてもっと知りたい方へ

ここで紹介したstrtotime関数の使い方については、以下の記事でもさまざまな使い方を紹介しています。

strtotime関数について、もっと知りたい方は以下の記事もぜひ参考にしてください!

主に以下のような内容を解説しています!
・指定した日付フォーマットに変換する方法
・日付を指定してファイルを削除する方法
・指定日時を取得する方法
・指定日の曜日を取得する方法

まとめ

この記事では日付を取得する方法や日付を比較する方法について解説を行いました。

その中でstrtotimeとDateTimeクラスを使う方法を解説しましたが、何か特別な理由がなければDateTimeクラスを使うようにしましょう!

もし日付の比較について忘れてしまったらこの記事を思い出してくださいね!

この記事を書いた人

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

目次