menu
ホーム > PHPサンプル > 日付系 > PHP 日付 を比較する
PHPサンプル

UPDATE:2019年06月27日

PHP 日付 を比較する

PHP 日付 を比較する | wepicks!
PHP4 PHP5 PHP7

PHP 日付 を比較する

PHP で日付を比較するには、DateTimeクラスstrtotime()関数 を使用して記述することが出来ます。DateTimeクラス は、日時を扱うクラスです。PHP5.2.0 で実装されました。DateTimeクラス では、日付に関する様々な処理が可能です。strtotime()関数は、UNIXタイムスタンプを取得する関数です。UNIXタイムスタンプを比較することで、日付を比較することが可能です。
タイムゾーンの指定
php.ini に記述する場合
date.timezone = Asia/Tokyo
スクリプトに記述する場合
<?php date_default_timezone_set ('Asia/Tokyo'); ?>
※日本時間に合わせます。タイムゾーンに誤りがあると日付系の関数やクラスでエラーが起こる場合があります。
使用する関数やクラス

書式 DateTimeクラス
オブジェクト = new DateTime(['英文形式 OR 日付/時刻のフォーマット文字列']);
//[ ]は省略可能です。
DateTimeクラス が理解できる英文形式フォーマット文字列
DateTimeクラス が理解できる日付/時刻のフォーマット文字列
DateTime format()メソッド が理解できるフォーマット文字列

書式 strtotime()
指定日時のUNIXタイムスタンプ = strtotime('英文形式 OR 日付/時刻 フォーマット文字列');
//返り値は数値(int)、失敗時は FALSE を返す
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列

※UNIXタイムスタンプは、1970年1月1日00時00分00秒UTC(協定世界時と一致する標準時)らの経過秒数です。例えば2019年5月15日01時34分25秒のUNIXタイムスタンプは 1557851665 となります。


DateTimeクラスで日付を比較する

DateTimeクラス で日付の比較

DateTimeクラスは様々な日付や時刻を表現できるクラスです。DateTimeクラスを呼び出しオブジェクト(インスタンス)を作成します「 オブジェクト = new DateTime(); 」。DateTimeクラスを呼び出す際に日付や時刻を指定することも出来ます「 オブジェクト = new DateTime('日付/時刻のフォーマット文字列'); 」。省略した場合は現在の日時になります。DateTimeクラスに指定する日時の書式は DateTime('2019-01-02 03:04:05'); というような形です。また、英文形式フォーマット文字列も理解可能で、その他にも様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
DateTimeクラス が理解できる英文形式フォーマット文字列
DateTimeクラス が理解できる日付/時刻のフォーマット文字列

DateTimeクラスのformat()メソッドは、指定した日付や時刻のフォーマット文字列から日時の文字列を返します「 日時の文字列 = オブジェクト->format('日付/時刻のフォーマット文字列'); 」。成功すると日時の文字列を返し、失敗すると FALSE を返します。format()メソッドで指定する日時のフォーマット文字列はdate()関数で指定するフォーマットと同じです。
DateTime format()メソッド が理解できるフォーマット文字列

比較する日付をDateTimeクラスで指定し、2つのオブジェクトを比較します。

結果は、

objDate1:2019-07-01 が未来の日付です。

となります。

DateTimeクラス で日時の比較

時間を含めた比較も可能です。

結果は、

objDate1:2019-06-01 01:02:02 と objDate2:2019-06-01 01:02:02 は同じ日時です。

となります。

strtotime()関数で日付を比較する

日付の比較

strtotime()関数 は、「英文形式で指定された日付や時刻のフォーマット文字列」、または、「日付/時刻のフォーマット文字列」を読み込み、結果をUNIXタイムスタンプの数値として返します。
UNIXタイムスタンプ = strtotime('英文形式の日付/時刻フォーマット文字列');
UNIXタイムスタンプ = strtotime('日付/時刻フォーマット文字列');
strtotime() に指定する最も一般的な日時の書式は strtotime('2019-12-31') や strtotime('2020-01-02 03:04:05') というような形です。その他にも様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列

UNIXタイムスタンプを比較することで、日付を比較することが可能です。

結果は、

date1:2021-06-01 と date2:2021-06-01 は同じ日付です。

となります。

日時の比較

strtotime()でも時間を含めた比較が可能です。

結果は、

date1:2021-06-01 01:02:03 が未来の日時です。

となります。

日付を比較して差を取得

2つの日付の差を取得(日数のみ)

strtotime()関数を使用して2つの日付の差を計算します。日付をタイムスタンプに変換し、それらの差を 86400 で割ると日数が出力されます。

実行結果
49日

2つの日時の差を取得(時間含める)

日数、時間、分、秒 の差
2つの日付を時間も含めた日時でその差を求める場合は、少し複雑になります。strtotime()関数を使用して日時の差を日数、時間、分、秒で出力する関数を作成してみます。

実行結果
483日
1時間
39分
17秒

DateTimeクラスで日付を比較して差を取得

diffメソッドは、2つの日付の差をあらわす DateInterval オブジェクトを返します。formatメソッドで指定した書式の日時を取得します。%Rは + や – の符号を出力するオプションです。

実行結果
+01年
+03月
+25日
+01時
+39分
+17秒

DateTimeクラス format()メソッド 日付/時刻フォーマット文字列

DateTimeクラス format()メソッド フォーマット

取得内容フォーマット文字説明戻り値の例
Y年 4 桁の数字1999 や 2019
y年 2 桁の数字99 や 19
L閏年かどうか。1なら閏年。0なら閏年ではない。1 か 0
$objDateTime = new DateTime();
echo $objDateTime->format('Y');//2019
echo $objDateTime->format('y');//19
echo $objDateTime->format('L');//0
F月 フルスペルの文字January~December
m月 数字。先頭にゼロをつける01~12
M月 3 文字形式Jan~Dec
n月 数字。先頭にゼロをつけない1~12
t月 指定した月の日数28~31
$objDateTime = new DateTime();
echo $objDateTime->format('F');//May
echo $objDateTime->format('m');//05
echo $objDateTime->format('M');//May
echo $objDateTime->format('n');//5
echo $objDateTime->format('t');//31
d日 2桁の数字(先頭にゼロがつく場合も)01~31
j日 数字。先頭にゼロをつけない1~31
$objDateTime = new DateTime();
echo $objDateTime->format('d');//07
echo $objDateTime->format('j');//7
曜日D3文字のテキスト形式Mon~Sun
lフルスペル形式Sunday~Saturday
N数字1(月曜) から 7(日曜)
w数字0(日曜) から 6(土曜)
W数字月曜日に始まる年単位の週番号
$objDateTime = new DateTime();
echo $objDateTime->format('D');//Wed
echo $objDateTime->format('l');//Wednesday
echo $objDateTime->format('N');//3
echo $objDateTime->format('w');//3
echo $objDateTime->format('W');//21
g12時間単位。先頭ゼロなし1~12
G24時間単位。先頭ゼロなし0~23
h12時間単位。先頭ゼロあり01~12
H24時間単位。先頭ゼロあり00~23
a午前/午後。小文字表示am pm
A午前/午後。大文字表示AM PM
$objDateTime = new DateTime();
echo $objDateTime->format('g');//12
echo $objDateTime->format('G');//0
echo $objDateTime->format('h');//12
echo $objDateTime->format('H');//00
echo $objDateTime->format('a');//pm
echo $objDateTime->format('A');//PM
i先頭ゼロあり00~59
$objDateTime = new DateTime();
echo $objDateTime->format('i');//59
s先頭ゼロあり00~59
$objDateTime = new DateTime();
echo $objDateTime->format('s');//01
ミリ秒vミリ秒654
$objDateTime = new DateTime();
echo $objDateTime->format('v');//000
マイクロ秒uマイクロ秒654321
$objDateTime = new DateTime();
echo $objDateTime->format('u');//000000
全日付cISO8601 フォーマット日付2019-05-15T01:04:54+09:00
rRFC2822 フォーマット日付Wed, 15 May 2019 01:04:54 +0900
$objDateTime = new DateTime();
echo $objDateTime->format('c');//2019-05-15T01:04:54+09:00
echo $objDateTime->format('r');//Wed, 15 May 2019 01:04:54 +0900
タイムゾーンオフセット秒数ZUTC(世界協定時間=グリニッジ天文台が有る場所東経0度の場所を基準にして決められている時間)の西側のタイムゾーン用のオフセット秒数は常に負になります。UTCの東側のオフセット秒数は常に正になります。 日本は32400なので、+9時間です。-43200 ~ 50400
$objDateTime = new DateTime();
echo $objDateTime->format('Z');//32400
UNIX時間からの秒数UUnix Epoch(エポック秒(UNIX時間))=1970年1月1日0時0分0秒からの秒数1557850516
$objDateTime = new DateTime();
echo $objDateTime->format('U');//1557850516

定義済み定数

以下の定数はフォーマットされた日付の文字列です。
<?php
echo DateTime::ATOM;//Y-m-d\TH:i:sP
echo '<br/>';
echo DateTime::COOKIE;//l, d-M-Y H:i:s T
echo '<br/>';
echo DateTime::ISO8601;//Y-m-d\TH:i:sO
echo '<br/>';
echo DateTime::RFC822;//D, d M y H:i:s O
echo '<br/>';
echo DateTime::RFC850;//l, d-M-y H:i:s T
echo '<br/>';
echo DateTime::RFC1036;//D, d M y H:i:s O
echo '<br/>';
echo DateTime::RFC1123;//D, d M Y H:i:s O
echo '<br/>';
echo DateTime::RFC2822;//D, d M Y H:i:s O
echo '<br/>';
echo DateTime::RFC3339;//Y-m-d\TH:i:sP
echo '<br/>';
echo DateTime::RSS;//D, d M Y H:i:s O
echo '<br/>';
echo DateTime::W3C;//Y-m-d\TH:i:sP
echo '<br/>';
?>
結果は
Y-m-d\TH:i:sP
l, d-M-Y H:i:s T
Y-m-d\TH:i:sO
D, d M y H:i:s O
l, d-M-y H:i:s T
D, d M y H:i:s O
D, d M Y H:i:s O
D, d M Y H:i:s O
Y-m-d\TH:i:sP
D, d M Y H:i:s O
Y-m-d\TH:i:sP
となります。

strtotime() 英文形式フォーマット文字列

strtotime() 英文形式フォーマット文字列

英文形式フォーマットで指定した日時のUNIXタイムスタンプを取得します。
※UNIXタイムスタンプは、1970年1月1日00時00分00秒UTC(協定世界時と一致する標準時)らの経過秒数です。例えば2019年5月15日1時34分25秒のUNIXタイムスタンプは 1557851665 となります。
戻り値の例やサンプルの結果は 2019-01-01 00:00:00 に実行した場合のものです。
取得内容英文形式のフォーマット文字列内容戻り値の例
今現在now今現在のUNIXタイムスタンプ1546268400
<?php echo strtotime("now");//1546268400 ?>
<?php echo date('Y-m-d H:i:s', strtotime('now'));//2019-01-01 00:00:00 ?>
本日today本日のUNIXタイムスタンプ1546268400
<?php echo strtotime("today");//1546268400 ?>
<?php echo date('Y-m-d', strtotime('today'));//2019-01-01 ?>
昨日yesterday昨日のUNIXタイムスタンプ1546182000
<?php echo strtotime("yesterday");//1546182000 ?>
<?php echo date('Y-m-d', strtotime('yesterday'));//2018-12-31 ?>
明日tomorrow明日のUNIXタイムスタンプ1546354800
<?php echo strtotime("tomorrow");//1546354800 ?>
<?php echo date('Y-m-d', strtotime('tomorrow'));//2019-01-02 ?>
今週this week今週の月曜日のUNIXタイムスタンプ1546182000
<?php echo strtotime("this week");//1546182000 ?>
<?php echo date('Y-m-d', strtotime('this week'));//2018-12-31 ?>
先週last week先週の月曜日のUNIXタイムスタンプ1545577200
<?php echo strtotime("last week");//1545577200 ?>
<?php echo date('Y-m-d', strtotime('last week'));//2018-12-24 ?>
来週next week来週の月曜日のUNIXタイムスタンプ1546786800
<?php echo strtotime("next week");//1546786800 ?>
<?php echo date('Y-m-d', strtotime('next week'));//2019-01-07 ?>
今月this month今月の同日のUNIXタイムスタンプ1546268400
<?php echo strtotime("this month");//1546268400 ?>
<?php echo date('Y-m-d', strtotime('this month'));//2019-01-01 ?>
先月last month先月の同日のUNIXタイムスタンプ1543590000
<?php echo strtotime("last month");//1543590000 ?>
<?php echo date('Y-m-d', strtotime('last month'));//2018-12-01 ?>
来月next month来月の同日のUNIXタイムスタンプ1548946800
<?php echo strtotime("next month");//1548946800 ?>
<?php echo date('Y-m-d', strtotime('next month'));//2019-02-01 ?>
今年this year今年の同日のUNIXタイムスタンプ1546268400
<?php echo strtotime("this year");//1546268400 ?>
<?php echo date('Y-m-d', strtotime('this year'));//2019-01-01 ?>
去年last year去年の同日のUNIXタイムスタンプ1514732400
<?php echo strtotime("last year");//1514732400 ?>
<?php echo date('Y-m-d', strtotime('last year'));//2018-01-01 ?>
来年next year来年の同日のUNIXタイムスタンプ1577804400
<?php echo strtotime("next year");//1577804400 ?>
<?php echo date('Y-m-d', strtotime('next year'));//2020-01-01 ?>
指定日付1 January 2019指定日付のUNIXタイムスタンプ1546268400
<?php echo strtotime("1 January 2019");//1546268400 ?>
<?php echo date('Y-m-d', strtotime("1 January 2019"));//2019-01-01 ?>
指定日時2019-01-02 03:04:05指定日時のUNIXタイムスタンプ1546365845
<?php strtotime('2019-01-02 03:04:05');//1546365845 ?>
<?php date('Y-m-d H:i:s', strtotime('2019-01-02 03:04:05'));//2019-01-02 03:04:05 ?>
本日から 年 月 日 週 を加算 (+ 省略可/- も可)+1 day +1 week +1 month +1 year年 月 日 週 の + - 指定のUNIXタイムスタンプ1581174000
<?php echo strtotime("+1 day +1 week +1 month +1 year");//1581174000 ?>
<?php echo date('Y-m-d', strtotime('+1 day +1 week +1 month +1 year'));//2020-02-09 ?>
今から+1時間1分1秒 (+ 省略可/- も可)+1 hours +1 min +1 seconds時、分、秒 の + - 指定のUNIXタイムスタンプ1546272061
<?php echo strtotime("+1 hours +1 min +1 seconds");//1546272061 ?>
<?php echo date('Y-m-d H:i:s', strtotime('+1 hours +1 min +1 seconds'));//2019-01-01 01:01:01 ?>
次の木曜日Thursday
next Thursday
次の木曜日のUNIXタイムスタンプ1546441200
<?php echo strtotime("Thursday");//1546441200 ?>
<?php date('Y-m-d', strtotime("Thursday"));//2019-01-03 ?>
前の木曜日last Thursday前の木曜日のUNIXタイムスタンプ1545836400
<?php echo strtotime("last Thursday");//1545836400 ?>
<?php date('Y-m-d', strtotime("last Thursday"));//2018-12-27 ?>
月の最初の日first day of this month指定月の最初の日のUNIXタイムスタンプ1546268400
<?php echo strtotime("first day of this month");//1546268400 ?>
<?php echo date('Y-m-d', strtotime("first day of this month"));//2019-01-01 ?>
月の最後の日last day of this month指定月の最後の日のUNIXタイムスタンプ1548860400
<?php echo strtotime("last day of this month");//1548860400 ?>
<?php echo date('Y-m-d', strtotime("last day of this month"));//2019-01-31 ?>
指定日から + -2020-01-01 00:00:00 +1 seconds +1 min +1 hours +1 day +1 week +1 month +1 year指定日から + - したUNIXタイムスタンプ1612800061
<?php
$format = '2020-01-01 00:00:00 +1 seconds +1 min +1 hours +1 day +1 week +1 month +1 year';
echo strtotime($format);//1612800061
echo date('Y-m-d H:i:s', strtotime($format));//2021-02-09 01:01:01
?>


タグ(=記事関連ワード)

タグ: ,

日付

投稿日:2019年6月3日
最終更新日:2019年06月27日

このカテゴリの他のページ

menu-page

この記事へのコメント

トラックバックurl

https://wepicks.net/phpsample-date-comparison/trackback/

page top