やりたいこと
- 今月を含めた、この先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" }
めでたし、めでたし