PHPで日付の比較をするにはDateTimeクラスが便利!
PHPを使ってWebサイトやWebアプリを作っていると、日付を表示したり、比較させたりしたいと思う場面も出てきます。
さらに、単に日付を表示するだけでなく日付の比較などができると便利な場合もあります。
ここではまず日付を表示・比較するにはどんな方法があるのか紹介し、その具体的な記述方法について解説していきます。
PHPで日付比較をする方法
PHPで日付を扱う方法はいくつかあります。
日付を比較することで、現在の時間からある時間までの時間や日数を計算して表示させることなどもできるようになります。これを実現するためには関数など、PHPに標準で搭載されている機能を使うと便利ですので、それぞれどのよう扱われているのか見ていきましょう。
関数を使う
まずは関数で日付を扱う場合を見ていきます。
PHPではtime()関数やdate()関数、strtotime()関数などがその代表です。
time()関数では現在のUNIXタイムスタンプを、
date()関数ではフォーマットを指定して日付の文字列等を、
strtotime()関数では日付表現をUNIXタイムスタンプに変換して返すことができます。
ちなみにUNIXタイムスタンプというのは1970年1月1日から経過した秒数のことで、これを変換すれば年月日などの見やすい表記にすることもできます。
<?php
echo time(), PHP_EOL;
echo date('Y-m-d'), PHP_EOL;
echo strtotime('now');
?>
//出力例
1551440614
2019-03-01
1551440614
上記の例においては、time()関数でプログラムを実行したある時点におけるUNIXタイムスタンプ、date()関数では「Y-m-d」を引数に渡すことでその時点における表示方法も指定、strtotime()関数でも「now」を引数に渡すことでその時刻をUNIXタイムスタンプに変換し、それらを表示させています。
これがそれぞれの関数の基本的な使い方になります。
日付の比較をするのであれば、strtotime()関数の引数に日付を渡すことで行えます。
下のプログラムでは2019年4月1日と2018年4月1日を比較し、その間に何日あるのか表示させています。この場合ちょうど1年の差になるため、365日分が差として表示されています。
UNIXタイムスタンプを変数に格納、比較、そしてこれを日数に変換するように計算・表示をさせます。
<?php
$time1 = strtotime('2019-04-01');
$time2 = strtotime('2018-04-01');
echo ($time1 - $time2) / (60 * 60 * 24);
?>
//出力結果
365
DateTimeクラスを使う
関数を使って日付の比較をすることはできますが、PHPにはDateTimeクラスというものが用意されており、こちらの使い方を覚えればより複雑な処理でも実行させられるようになります。以下でDateTimeクラスについて詳しく見ていきましょう。
DateTimeクラスで日付を表示する方法
DateTimeクラスは日付や時刻を扱うことができるクラスです。
そこで、色んな表現にてDateTimeのオブジェクトを作成、フォーマットを指定して日付を文字列等として表示させることができます。さらに日付・時刻の足し算や引き算をすることでその比較も行えます。
まずは基本的な使用方法として、プログラム実行時の年月日を表示させてみます。
<?php
$time = new DateTime();
echo $time->format('Y-m-d');
?>
//出力結果
2019-03-01
クラスを使用していますので時刻を表示させる前にオブジェクトの作成をしています。そして日付の表示させるためにformat()メソッドを使用していることもポイントになります。
format()メソッドとフォーマット文字
format()メソッドは作成したオブジェクトが持つ日付の情報を、どのような表現方法で表示させるのか、といったことを指定するメソッドです。
「Y-m-d」とした場合、大文字の「Y」は年を4桁で表示、小文字の「m」は月を2桁で表示、小文字の「d」は日を2桁で表示するように指定しています。
他にも様々なフォーマット文字を使って色んな表現ができるようになっています。代表的なものは下の表にまとめてみました。
表記 | 内容 | 詳細 |
---|---|---|
d | 日 | 2桁表示 |
j | 日 | 先頭に0を付けない |
m | 月 | 2桁表示 |
n | 月 | 先頭に0を付けない |
y | 年 | 2桁表示 |
Y | 年 | 4桁表示 |
h | 時刻 | 12時間単位 |
H | 時刻 | 24時間単位 |
DateTimeクラスのメソッドで日付の比較をする方法
それでは、DateTimeクラスを使って日付の比較をしてみましょう
具体的にはdiff()メソッド、add()メソッド、sub()メソッドを使って差の計算および加算と減算を行います。
diff()メソッドで日付間の差を調べる
diff()メソッドでは2つの日付間の差を調べることができ、表示をするにはフォーマットを指定し好きな表現方法を選びます。
ただし日付や時刻の「間隔」を表現する場合には各フォーマット文字の前に「%」を付けることに注意しましょう。
<?php
$time1 = new DateTime('2019-04-01');
$time2 = new DateTime('2018-02-05');
$diff = $time1->diff($time2);
echo $diff->format('%y年と%m月と%d日'), PHP_EOL;
echo $diff->format('総日数は%a日');
?>
//出力結果
1年と1月と24日
総日数は420日
この例では2019年4月1日と2018年2月5日の比較をしています。
年月日や総日数で表すことも、さらに別の方法で表すことも指定すれば可能となります。
add()メソッドで日付を加算する
add()メソッドは、DateTimeオブジェクトで指定した日時にある日時分、加算することのできるメソッドです。
そしてある日時分はDateIntervalという時間間隔を表すクラスを使って指定します。間隔を表す文字列フォーマットは「P」から始め、間隔を指示するフォーマット文字として年ならY、月ならM、日ならDといった具合に指定していきます。
<?php
$date = new DateTime('2019-04-01');
$date->add(new DateInterval('P1Y1M1D'));
echo $date->format('Y-m-d');
?>
//出力結果
2020-05-02
sub()メソッドで日付を減算する
sub()メソッドは、ある日付から指定した日時分だけ減算をすることができます。
add()メソッドと同じように使うことができ、負の値を減算させようとするとadd()メソッドと同じ働きをします。逆にadd()メソッドにおいて負の値を加算させようとすればsub()メソッドと同じように働かせることができます。
<?php
$date = new DateTime('2019-04-01');
$date->sub(new DateInterval('P1Y1M1D'));
echo $date->format('Y-m-d');
?>
//出力結果
2018-02-28
与えた間隔は上で紹介したadd()メソッドと同じで1年1か月と1日です。
ただし今回は減算をしていますので、2019年4月1日からその分だけ計算した結果、2018年2月28日が表示されています。
modify()メソッドで日付を変更する
modify()メソッドは、ある日付から指定した分だけ加算・減算をすることができます。
日単位の加算の場合はこのようになります。
<?php
$date = new \DateTime('2019-04-01');
$date->modify('+1 day');
echo $date->format('Y-m-d');
?>
//出力結果
2019-04-02
減算する場合は、「-」を付けて実行します。
<?php
$date = new \DateTime('2019-04-01');
$date->modify('-1 day');
echo $date->format('Y-m-d');
?>
//出力結果
2019-03-31
他にも月単位や、
<?php
$date = new \DateTime('2019-04-01');
$date->modify('+1 month');
echo $date->format('Y-m-d');
?>
//出力結果
2019-05-01
年単位でも実行できます。
<?php
$date = new \DateTime('2019-04-01');
$date->modify('-1 year');
echo $date->format('Y-m-d');
?>
//出力結果
2018-04-01
まとめ
PHPにおいて日付の比較をする方法を紹介しました。関数を使う、もしくはDateTimeクラスを使うなどして比較ができます。
DateTimeクラスを使う場合にはdiff()メソッドで日付の差、add()メソッドで加算、sub()メソッドで減算することができます。実際に時刻表示をさせる場合にはformat()メソッドを使いますので、「Y」や「d」などといったフォーマット文字の使い方には注意するようにしましょう。
##この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。