PHPで指定時間前(1日前・1年前など)、指定時間後(1日前・1年後など)を求める方法

シェアする

PHPを使用していて、現在日付から1日後だったり、1ヶ月後や1年前の日付を取得しないといけない機会が出てくると思います。
今回の記事では、PHPを使用して、指定日付前だったり、指定日付後の日付を求める方法について紹介します。

日付のフォーマットの仕方については、下記の記事を参照。

PHPで日付のフォーマットを指定したり、フォーマットの変換をする方法について紹介しています。

date関数を使用し日時を求める方法

指定した現在の日付からの相対的な日付を求めるPHPスクリプト

<?php

//現在からの相対的な日付(前)
echo  "1日前 " . date("Y-m-d H:i:s",strtotime("-1 day"));
echo  "1ヶ月前 " . date("Y-m-d H:i:s",strtotime("-1 month"));
echo  "1年前 " . date("Y-m-d H:i:s",strtotime("-1 year"));
echo  "1週間前 " . date("Y-m-d H:i:s",strtotime("-1 week"));
echo  "1時間前 " . date("Y-m-d H:i:s",strtotime("-1 hour"));
echo  "1分前 " . date("Y-m-d H:i:s",strtotime("-1 minute"));
echo  "1秒前 " . date("Y-m-d H:i:s",strtotime("-1 second"));

//現在からの相対的な日付(後)
echo  "1日後 " . date("Y-m-d H:i:s",strtotime("+1 day"));
echo  "1ヶ月後 " . date("Y-m-d H:i:s",strtotime("+1 month"));
echo  "1年後 " . date("Y-m-d H:i:s",strtotime("+1 year"));
echo  "1週間後 " . date("Y-m-d H:i:s",strtotime("+1 week"));
echo  "1時間後 " . date("Y-m-d H:i:s",strtotime("+1 hour"));
echo  "1分後 " . date("Y-m-d H:i:s",strtotime("+1 minute"));
echo  "1秒後 " . date("Y-m-d H:i:s",strtotime("+1 second"));

//現在日付でなく指定の日付からの相対的な日付を求める
echo date('Y-m-d', strtotime('2018-04-07 +1 day')); //  2016-01-01

結果(改行等を追加しています)

//現在からの相対的な日付(前)
1日前 2018-04-06 08:11:28
1ヶ月前 2018-03-07 08:11:28
1年前 2017-04-07 08:11:28
1週間前 2018-03-31 08:11:28
1時間前 2018-04-07 07:11:28
1分前 2018-04-07 08:10:28
1秒前 2018-04-07 08:11:27

//現在からの相対的な日付(後)
1日後 2018-04-08 08:11:28
1ヶ月後 2018-05-07 08:11:28
1年後 2019-04-07 08:11:28
1週間後 2018-04-14 08:11:28
1時間後 2018-04-07 09:11:28
1分後 2018-04-07 08:12:28
1秒後 2018-04-07 08:11:29

//現在日付でなく指定の日付からの相対的な日付を求める
1ヶ月後 2018-04-07 08:11:28

上記の様にdate関数とstrtotime関数を使用することで、PHPで現在の日付からの相対的な前後の日付を取得することが出来ます。

しかし、このdate関数とstrtotime関数を使用して、日付を求めることには問題もあります。

date関数とstrtotime関数を使用し指定日からの想定の日付を求めることの問題点とその対応

date関数とstrtotime関数を使用すると2038年問題という問題を考えないといけないかも知れない

date関数とstrotime関数を使用し、指定日からの相対的な日付を求める上での問題点は、2038年問題と言われる問題です。
この問題は、64bitのPHPを使用すること(2922億7702万4641年まで)で回避できますが、32bitのPHPを使用しdate関数を使用する場合は、覚えておく必要があります。
Unixタイムスタンプが32Bitの最大表現限界である2,147,483,647を超えてしまいオーバーフローを起こしてしまうので、日付の変換がうまく出来ないという問題です。Unixタイムスタンプがオーバーフローを起こし、-2,147,483,647から計算されてしまいます。

2038年問題を回避するためにもDateTimeクラスを使うのがおすすめ

この2038年問題を回避するのにDateTimeクラス(PHP5.2以降で使用可能)を使用して、現在時等などの指定時間から相対的な時間を求めるのがおすすめです。
特に、date関数とstrtotime関数を使用して、2038年1月19日火曜日 3時14分08秒以降の日時を求める必要がある場合は、PHPを62ビットにするかDateTimeクラスを使用して日付を求めましょう。

DateTimeクラスを使用し日時を求める方法

指定した現在の日付からの相対的な日付を求めるPHPスクリプト

//現在からの相対的な日付(前)
$date1 = new DateTime();
echo "1日前 " .$date1->modify('-1 day')->format('Y-m-d H:i:s');
$date2 = new DateTime();
echo "1ヶ月前 " .$date2->modify('-1 month')->format('Y-m-d H:i:s');
$date3 = new DateTime();
echo "1年前 " . $date3->modify('-1 year')->format('Y-m-d H:i:s');
$date4 = new DateTime();
echo "1週間前 " . $date4->modify('-1 week')->format('Y-m-d H:i:s');
$date5 = new DateTime(); 
echo "1時間前 " . $date5->modify('-1 hour')->format('Y-m-d H:i:s');
$date6 = new DateTime();
echo "1分前 " . $date6->modify('-1 minute')->format('Y-m-d H:i:s');
$date7 = new DateTime(); 
echo "1秒前 " . $date7->modify('-1 second')->format('Y-m-d H:i:s');

//現在からの相対的な日付(後)
$date8 = new DateTime();
echo "1日後 " . $date8->modify('+1 day')->format('Y-m-d H:i:s');
$date9 = new DateTime();
echo "1ヶ月後 " . $date9->modify('+1 month')->format('Y-m-d H:i:s');
$date10 = new DateTime();
echo "1年後 " . $date10->modify('+1 year')->format('Y-m-d H:i:s');
$date11 = new DateTime();
echo "1週間後 " . $date11->modify('+1 week')->format('Y-m-d H:i:s');
$date12 = new DateTime();
echo "1時間後 " . $date12->modify('+1 hour')->format('Y-m-d H:i:s');
$date13 = new DateTime();
echo "1分後 " . $date13->modify('+1 minute')->format('Y-m-d H:i:s');
$date14 = new DateTime();
echo "1秒後 " . $date14->modify('+1 second')->format('Y-m-d H:i:s');

//特定の日付を指定
$day = new DateTime('2099-04-01 23:59:59');
echo "2099-04-01の1日前 " .$day->modify('-1 day')->format('Y-m-d H:i:s');

結果(改行等を追加しています)

//現在からの相対的な日付(前)
1日前 2018-04-06 08:55:18
1ヶ月前 2018-03-07 08:55:18
1年前 2017-04-07 08:55:18
1週間前 2018-03-31 08:55:18
1時間前 2018-04-07 07:55:18
1分前 2018-04-07 08:54:18
1秒前 2018-04-07 08:55:17

//現在からの相対的な日付(後)
1日後 2018-04-08 08:55:18
1ヶ月後 2018-05-07 08:55:18
1年後 2019-04-07 08:55:18
1週間後 2018-04-14 08:55:18
1時間後 2018-04-07 09:55:18
1分後 2018-04-07 08:56:18
1秒後 2018-04-07 08:55:19

//現在日付でなく指定の日付からの相対的な日付を求める
//2099年も問題なく日付の計算が出来ます。
2099-04-01の1日前 2099-03-31 23:59:59

date関数をstrtotime関数を使用して、日付の計算をするのをよくみますが、2038年問題のことを考えるとシステムの環境面について考えなくて良いので、DateTimeクラスをなるべく使用して日付の計算をすると良いのではないかと個人的には思います。

PHPの日付時刻関連のライブラリ

PHPには、日付時刻関係の有名なライブラリが、あります。
現在日からの何日後何週間前等に値を求めたり、日付の差などの扱いが直感的に行えます。

興味のある方は、下記の記事を参照ください。

PHPで日付関連の処理をするのに便利なCarbonの使用方法について紹介しています。CarbonはGitHubでも多数のスターの付く人気の日付関連のライブラリーです。
PHPの日付・時刻ライブラリChronosの機能について紹介しています。Carbonとの違いについても説明しています。