PHPの日時で何○○後、何××前を簡単に実装する

# 前提

PHP：5.3以降


# 解説
PHPでは、
date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 day' ) ); // 2日後
date( 'Y年m月d日 H時i分s秒' , strtotime( '-3 month' ) ); // 3か月前
とか、+2 dayとか直観的日時を増減できるAPIが提供されています。
以下は、そのコード例です。

# コード例


```php:date_sample.php
define( 'TARGET_DATE' , '2010-09-08 09:11:22' );

$nowDateStr		=  date( 'Y年m月d日 H時i分s秒' )
		. " or " . date( 'Y-m-d H:i:s' )
		. " or " . date( 'YmdHis' )
		;


$targetDate		= date( 'Y-m-d H:i:s' , strtotime( TARGET_DATE ) );

$targetDateStr	 = date( 'Y年m月d日 H時i分s秒'	, date( strtotime( TARGET_DATE ) ) )
		. " or " . date( 'Y-m-d H:i:s'			, strtotime( TARGET_DATE ) )
		. " or " . date( 'YmdHis'				, date( strtotime( TARGET_DATE ) ) )
		; 


echo "<h1>日時のテスト</h1>\n";


echo "<h2>【基本形】現在日時[" . $nowDateStr  ."]をベースに表示</h2>\n";



echo <<<HTML
現在日時1(西暦での日本語表記)：<br>
date( 'Y年m月d日 H時i分s秒' );<br>
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' ) );


echo <<<HTML
現在日時2(見やすい簡略表示)：<br>
date( 'Y-m-d H:i:s' );<br>
HTML;
var_dump( date( 'Y-m-d H:i:s' ) );


echo <<<HTML
現在日時3(結合文字列表記)：<br>
date( 'YmdHis' );<br>
HTML;
var_dump( date( 'YmdHis' ) );


echo <<<HTML
現在日時4(結合文字列表記(秒無し))：<br>
date( 'YmdHi' );<br>
HTML;
var_dump( date( 'YmdHi' ) );



echo "<h2>【計算】現在日時[" . $nowDateStr  ."]をベースに各種PHPでの日時変更APIを使用して、指定の条件で過去・未来に変換</h2>\n";


echo <<<HTML
現在日時から、1日前：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 day' ) );<br>
date( 'YmdHis' , strtotime( '-1 day' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 day' ) ) );
var_dump( date( 'YmdHis' , strtotime( '-1 day' ) ) );


echo <<<HTML
現在日時から、2日後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 day' ) );<br>
date( 'YmdHis' , strtotime( '+2 day' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 day' ) ) );
var_dump( date( 'YmdHis' , strtotime( '+2 day' ) ) );


echo <<<HTML
現在日時から、1週間前：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 week' ) );<br>
date( 'YmdHis' , strtotime( '-1 week' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 week' ) ) );
var_dump( date( 'YmdHis' , strtotime( '-1 week' ) ) );


echo <<<HTML
現在日時から、3か月後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '+3 month' ) );<br>
date( 'YmdHis' , strtotime( '+3 month' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '+3 month' ) ) );
var_dump( date( 'YmdHis' , strtotime( '+3 month' ) ) );


echo <<<HTML
現在日時から、2年後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 year' ) );<br>
date( 'YmdHis' , strtotime( '+2 year' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 year' ) ) );
var_dump( date( 'YmdHis' , strtotime( '+2 year' ) ) );


echo <<<HTML
現在日時から、12時間前：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '-12 hour' ) );<br>
date( 'YmdHis' , strtotime( '-12 hour' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '-12 hour' ) ) );
var_dump( date( 'YmdHis' , strtotime( '-12 hour' ) ) );


echo <<<HTML
現在日時から、20分後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '+20 minute' ) );<br>
date( 'YmdHis' , strtotime( '+20 minute' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '+20 minute' ) ) );
var_dump( date( 'YmdHis' , strtotime( '+20 minute' ) ) );


echo <<<HTML
現在日時から、30秒前：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '-30 second' ) );<br>
date( 'YmdHis' , strtotime( '-30 second' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '-30 second' ) ) );
var_dump( date( 'YmdHis' , strtotime( '-30 second' ) ) );


echo <<<HTML
現在日時から、明日（1日後）：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( 'tomorrow' ) );<br>
date( 'YmdHis' , strtotime( 'tomorrow' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( 'tomorrow' ) ) );
var_dump( date( 'YmdHis' , strtotime( 'tomorrow' ) ) );


echo <<<HTML
現在日時から、昨日（1日前）：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( 'yesterday' ) );<br>
date( 'YmdHis' , strtotime( 'yesterday' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( 'yesterday' ) ) );
var_dump( date( 'YmdHis' , strtotime( 'yesterday' ) ) );


echo <<<HTML
現在日時から、first day（1日後）：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( 'first day' ) );<br>
date( 'YmdHis' , strtotime( 'first day' ) );<br>
※ここでのfirstは1日目という意味では無く、単純な1という数字であるので注意！！
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( 'first day' ) ) );
var_dump( date( 'YmdHis' , strtotime( 'first day' ) ) );


echo <<<HTML
現在日時から、next day（1日後）：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( 'next day' ) );<br>
date( 'YmdHis' , strtotime( 'next day' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( 'next day' ) ) );
var_dump( date( 'YmdHis' , strtotime( 'next day' ) ) );


echo <<<HTML
【複合】現在日時から、2日後＋3時間後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 day +3 hour' ) );<br>
date( 'YmdHis' , strtotime( '+2 day +3 hour' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '+2 day +3 hour' ) ) );
var_dump( date( 'YmdHis' , strtotime( '+2 day +3 hour' ) ) );



echo "<h2>指定の日時[" . $targetDateStr . "]をベースに表示</h2>\n";

echo <<<HTML
<h2>define( 'TARGET_DATE' , '2010-09-08 09:11:22' );</h2>
HTML;

echo <<<HTML
日時指定1(西暦での日本語表記)：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( TARGET_DATE ) );<br>
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( TARGET_DATE ) ) );


echo <<<HTML
日時指定2(見やすい簡略表示)：<br>
date( 'Y-m-d H:i:s' , date( strtotime( TARGET_DATE ) ) );
HTML;
var_dump( date( 'Y-m-d H:i:s' , date( strtotime( TARGET_DATE ) ) ) );


echo <<<HTML
日時指定3(結合文字列表記に変換)：<br>
date( 'YmdHis' , date( strtotime( TARGET_DATE ) ) );
HTML;
var_dump( date( 'YmdHis' , date( strtotime( TARGET_DATE ) ) ) );


echo <<<HTML
日時指定4(結合文字列表記(秒無し)に変換)：<br>
date( 'YmdHi' , date( strtotime( TARGET_DATE ) ) );
HTML;
var_dump( date( 'YmdHi' , date( strtotime( TARGET_DATE ) ) ) );



echo "<h2>【計算】指定の日時[" . $targetDateStr . "]をベースに各種PHPでの日時変更APIを使用して、指定の条件で過去・未来に変換</h2>\n";


echo <<<HTML
指定日時から、2日後：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( TARGET_DATE . ' +2 day' ) );<br>
date( 'YmdHis' , strtotime( TARGET_DATE . ' +2 day' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( TARGET_DATE . ' +2 day' ) ) );
var_dump( date( 'YmdHis' , strtotime( TARGET_DATE . ' +2 day' ) ) );

echo <<<HTML
指定日時から、1日前：<br>
date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 day' ) );<br>
date( 'YmdHis' , strtotime( '-1 day' ) );
HTML;
var_dump( date( 'Y年m月d日 H時i分s秒' , strtotime( '-1 day' ) ) );
var_dump( date( 'YmdHis' , strtotime( '-1 day' ) ) );

```


# 駄文

PHPやPythonは、標準関数や標準モジュールで日時関係は
かなり扱いやすいですが、素のJavaScriptではかなり大変なので、
moment.jsを使うので決まりかなと最近思っています。