phpで1ヶ月先を取得しようとしてハマった

Web
desktop

やりたいこと

  • 今月を含めた、この先1年分の年月配列が欲しい
  • 来年の今月は含まない

まずは普通にこう書いた

$_wa_month = array();
for ($i=0; $i<=11; $i++) {
  $_wa_month[] = date('Ym', strtotime('+'.$i.' month'));
}
var_dump($_wa_month);

これで多分大丈夫だろうと思った。
普通のPHPerの方なら、同じであってほしい…

結果

array(12) {
  [0]=> string(6) "201205"
  [1]=> string(6) "201207" //おかしい!
  [2]=> string(6) "201207"
  [3]=> string(6) "201208"
  [4]=> string(6) "201210" //おかしい!
  [5]=> string(6) "201210"
  [6]=> string(6) "201212" //おかしい!
  [7]=> string(6) "201212"
  [8]=> string(6) "201301"
  [9]=> string(6) "201303" //おかしい!
  [10]=> string(6) "201303"
  [11]=> string(6) "201305" //おかしい!
}

なぜこうなったか?

結論から言うと、今日が5月31日だからだった

//5月31日の1か月後は31日後ということで
//6月を通り越し7月1日になってしまう!
echo date('Ym', strtotime('+1 month'));

実行日が29~31日の場合に陥るイージーミスである
※2月が日数が少ないので特に陥りやすい

そのため、今回の問題をクリアするには基準日を月初に設定する必要がある。
なのでこんな感じ

$_wa_month = array();
for ($i=0; $i<=11; $i++) {
  $_wa_month[] = date('Ym', strtotime(date('Ym01').' +'.$i.' month'));
}
var_dump($_wa_month);

これで解決である

array(12) {
  [0]=> string(6) "201205"
  [1]=> string(6) "201206"
  [2]=> string(6) "201207"
  [3]=> string(6) "201208"
  [4]=> string(6) "201209"
  [5]=> string(6) "201210"
  [6]=> string(6) "201211"
  [7]=> string(6) "201212"
  [8]=> string(6) "201301"
  [9]=> string(6) "201302"
  [10]=> string(6) "201303"
  [11]=> string(6) "201304"
}

めでたし、めでたし

タイトルとURLをコピーしました