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

やりたいこと

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

まずは普通にこう書いた

[php]
$_wa_month = array();
for ($i=0; $i<=11; $i++) {
$_wa_month[] = date(‘Ym’, strtotime(‘+’.$i.’ month’));
}
var_dump($_wa_month);
[/php]
これで多分大丈夫だろうと思った。
普通のPHPerの方なら、同じであってほしい…

結果

[php]
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" //おかしい!
}
[/php]

なぜこうなったか?

結論から言うと、今日が5月31日だからだった
[php]
//5月31日の1か月後は31日後ということで
//6月を通り越し7月1日になってしまう!
echo date(‘Ym’, strtotime(‘+1 month’));
[/php]

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

そのため、今回の問題をクリアするには基準日を月初に設定する必要がある。
なのでこんな感じ
[php highlight=”3″]
$_wa_month = array();
for ($i=0; $i<=11; $i++) {
$_wa_month[] = date(‘Ym’, strtotime(date(‘Ym01′).’ +’.$i.’ month’));
}
var_dump($_wa_month);
[/php]

これで解決である
[php]
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"
}
[/php]
めでたし、めでたし

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です