UPDATE:2019年06月27日
PHP 日付 を比較する
PHP 日付 を比較する
php.ini に記述する場合
書式 DateTimeクラス
オブジェクト = new DateTime(['英文形式 OR 日付/時刻のフォーマット文字列']);
//[ ]は省略可能です。
DateTimeクラス が理解できる英文形式フォーマット文字列
DateTimeクラス が理解できる日付/時刻のフォーマット文字列
DateTime format()メソッド が理解できるフォーマット文字列
書式 strtotime()
指定日時のUNIXタイムスタンプ = strtotime('英文形式 OR 日付/時刻 フォーマット文字列');
//返り値は数値(int)、失敗時は FALSE を返す
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列
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つのオブジェクトを比較します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php //クラスを呼び出してオブジェクトを作成 //比較する日付を指定 $objDate1 = new DateTime('2019-07-01'); $objDate2 = new DateTime('2019-06-01'); //2つのオブジェクトを比較 if($objDate1 == $objDate2){ echo 'objDate1:'.$objDate1->format('Y-m-d').' と objDate2:'.$objDate2->format('Y-m-d').' は同じ日付です。<br>'; }elseif($objDate1 > $objDate2){ echo 'objDate1:'.$objDate1->format('Y-m-d').' が未来の日付です。<br>'; }else{ echo 'objDate2:'.$objDate2->format('Y-m-d').' が未来の日付です。<br>'; } ?> |
結果は、
となります。
DateTimeクラス で日時の比較
時間を含めた比較も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php //クラスを呼び出してインスタンスを作成 //比較する日時を指定 $objDate1 = new DateTime('2019-06-01 01:02:02'); $objDate2 = new DateTime('2019-06-01 01:02:02'); //2つのインスタンスを比較 if($objDate1 == $objDate2){ echo 'objDate1:'.$objDate1->format('Y-m-d H:i:s').' と objDate2:'.$objDate2->format('Y-m-d H:i:s').' は同じ日時です。<br>'; }elseif($objDate1 > $objDate2){ echo 'objDate1:'.$objDate1->format('Y-m-d H:i:s').' が未来の日時です。<br>'; }else{ echo 'objDate2:'.$objDate2->format('Y-m-d H:i:s').' が未来の日時です。<br>'; } ?> |
結果は、
となります。
strtotime()関数で日付を比較する
日付の比較
strtotime()関数 は、「英文形式で指定された日付や時刻のフォーマット文字列」、または、「日付/時刻のフォーマット文字列」を読み込み、結果をUNIXタイムスタンプの数値として返します。
「 UNIXタイムスタンプ = strtotime('英文形式の日付/時刻フォーマット文字列'); 」
「 UNIXタイムスタンプ = strtotime('日付/時刻フォーマット文字列'); 」
strtotime() に指定する最も一般的な日時の書式は strtotime('2019-12-31') や strtotime('2020-01-02 03:04:05') というような形です。その他にも様々なフォーマットがあります。興味のある方は以下のページを参照下さい。
strtotime() が理解できる英文形式フォーマット文字列
strtotime() が理解できる日付/時刻のフォーマット文字列
UNIXタイムスタンプを比較することで、日付を比較することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php //比較する日付のタイムスタンプを作成 $date1 = strtotime('2021-06-01'); $date2 = strtotime('2021-06-01'); //2つのタイムスタンプを比較 if($date1 == $date2){ echo 'date1:'.date('Y-m-d', $date1).' と date2:'.date('Y-m-d', $date2).' は同じ日付です。<br>'; }elseif($date1 > $date2){ echo 'date1:'.date('Y-m-d', $date1).' が未来の日付です。<br>'; }else{ echo 'date2:'.date('Y-m-d', $date2).' が未来の日付です。<br>'; } ?> |
結果は、
となります。
日時の比較
strtotime()でも時間を含めた比較が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php //比較する日時のタイムスタンプを作成 $date1 = strtotime('2021-06-01 01:02:03'); $date2 = strtotime('2021-06-01 01:02:02'); //2つのタイムスタンプを比較 if($date1 == $date2){ echo 'date1:'.date('Y-m-d H:i:s', $date1).' と date2:'.date('Y-m-d H:i:s', $date2).' は同じ日時です。<br>'; }elseif($date1 > $date2){ echo 'date1:'.date('Y-m-d H:i:s', $date1).' が未来の日時です。<br>'; }else{ echo 'date2:'.date('Y-m-d H:i:s', $date2).' が未来の日時です。<br>'; } ?> |
結果は、
となります。
日付を比較して差を取得
2つの日付の差を取得(日数のみ)
strtotime()関数を使用して2つの日付の差を計算します。日付をタイムスタンプに変換し、それらの差を 86400 で割ると日数が出力されます。
1 2 3 4 5 6 | <?php $date1 = '2019-05-01'; $date2 = '2019-06-19'; echo ((strtotime($date2) - strtotime($date1)) / 86400).'日'; //出力 49日 ?> |
2つの日時の差を取得(時間含める)
日数、時間、分、秒 の差
2つの日付を時間も含めた日時でその差を求める場合は、少し複雑になります。strtotime()関数を使用して日時の差を日数、時間、分、秒で出力する関数を作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php //日数と時分秒の差を返す関数 function date_time_diff($d1, $d2){ //初期化 $diffDateTime = array(); //タイムスタンプ $timeStamp1 = strtotime($d1); $timeStamp2 = strtotime($d2); //タイムスタンプの差を計算 $difSeconds = $timeStamp2 - $timeStamp1; //秒の差を取得 $diffDateTime['seconds'] = $difSeconds % 60; //分の差を取得 $difMinutes = ($difSeconds - ($difSeconds % 60)) / 60; $diffDateTime['minutes'] = $difMinutes % 60; //時の差を取得 $difHours = ($difMinutes - ($difMinutes % 60)) / 60; $diffDateTime['hours'] = $difHours % 24; //日数の差を取得 $difDays = ($difHours - ($difHours % 24)) / 24; $diffDateTime['days'] = $difDays; //結果を返す return $diffDateTime; } //初期化 $diffDateTimeOutPut = array(); //差を求める日時 $dateTime1 = '2019-08-25 23:32:51'; $dateTime2 = '2020-12-21 01:12:08'; //関数実行 $diffDateTimeOutPut = date_time_diff($dateTime1, $dateTime2); //日時の差を表示 echo $diffDateTimeOutPut['days'].'日<br>'; echo $diffDateTimeOutPut['hours'].'時間<br>'; echo $diffDateTimeOutPut['minutes'].'分<br>'; echo $diffDateTimeOutPut['seconds'].'秒<br>'; ?> |
1時間
39分
17秒
DateTimeクラスで日付を比較して差を取得
diffメソッドは、2つの日付の差をあらわす DateInterval オブジェクトを返します。formatメソッドで指定した書式の日時を取得します。%Rは + や – の符号を出力するオプションです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php //差を求める日時 $dateTime1 = '2019-08-25 23:32:51'; $dateTime2 = '2020-12-21 01:12:08'; //DateTimeクラス $objDatetime1 = new DateTime($dateTime1); $objDatetime2 = new DateTime($dateTime2); //diffメソッド //ふたつの日付の差をあらわす DateInterval オブジェクトを返します。 $objInterval = $objDatetime1->diff($objDatetime2); //%Rは + や - の符号を出力するオプションです echo $objInterval->format('%R%Y').'年<br>'; echo $objInterval->format('%R%M').'月<br>'; echo $objInterval->format('%R%D').'日<br>'; echo $objInterval->format('%R%H').'時<br>'; echo $objInterval->format('%R%I').'分<br>'; echo $objInterval->format('%R%S').'秒<br>'; ?> |
+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
| |||
曜日 | D | 3文字のテキスト形式 | 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
| |||
時 | g | 12時間単位。先頭ゼロなし | 1~12 |
G | 24時間単位。先頭ゼロなし | 0~23 | |
h | 12時間単位。先頭ゼロあり | 01~12 | |
H | 24時間単位。先頭ゼロあり | 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
| |||
全日付 | c | ISO8601 フォーマット日付 | 2019-05-15T01:04:54+09:00 |
r | RFC2822 フォーマット日付 | 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
| |||
タイムゾーンオフセット秒数 | Z | UTC(世界協定時間=グリニッジ天文台が有る場所東経0度の場所を基準にして決められている時間)の西側のタイムゾーン用のオフセット秒数は常に負になります。UTCの東側のオフセット秒数は常に正になります。 日本は32400なので、+9時間です。 | -43200 ~ 50400 |
$objDateTime = new DateTime();
echo $objDateTime->format('Z');//32400
| |||
UNIX時間からの秒数 | U | Unix 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/>'; ?>
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タイムスタンプを取得します。取得内容 | 英文形式のフォーマット文字列 | 内容 | 戻り値の例 |
---|---|---|---|
今現在 | 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年06月27日