PHPのdate型で[先月][翌月]を正確に行う方法(注意点)

PHPのdate型では、特定の日付を軸に先月や翌月などの日付を取得することができる。
機能自体は簡単に実現できるのだが、ここで誤った日付操作をすると思わぬトラブルが発生してしまうので、気を付けよう。

まずは悪い例です。こんな使い方をしている人がいたら改めてください。

//先月の場合
echo date(‘m’, strtotime(‘2016-10-31 -1 month’));
//今月の場合
echo date(‘m’, strtotime(‘2016-10-31’));
//翌月の場合
echo date(‘m’, strtotime(‘2016-10-31 +1 month’));

//結果
先月 => 10
今月 => 10
翌月 => 12

この結果は、2016年10月31日の1ヶ月前は2016年9月31日だ!とコンピュータが判断した結果です。
単純に、月を1つ前にずらしたにすぎません。
9月は31日が無いため、残念な結果になってしまい、これではシステムの稼働中にエラーが出てしまいます。

正しい表示の仕方

//先月の場合
echo date(‘m’, strtotime(date(‘Y-m-1′).’ -1 month’));
//今月の場合
echo date(‘m’)
//翌月の場合
echo date(‘m’, strtotime(date(‘Y-m-1′).’ +1 month’));

//結果
先月 => 10
今月 => 11
翌月 => 12

このようにすれば、月の1日をベースにして「1ヶ月前」「1ヶ月後」を取得することが出来ます。

ちなみに、とある対象の年月を基準として先月の25日を取得したい!というような特定の日付はこうすれば確実です。

特定の日付
$targetDate = “2017-5-30”;
//まずは先月を求める
$first = date(‘Y-m-d’, strtotime(date($targetDate).’ -1 month’));
//先月の25日を取得
echo date(‘Y-m-d’, strtotime($first),’+24 day’);
   もしくは
echo date(‘Y-m-25’, strtotime($first));

//表示
2017-4-25

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)