2009 年 1 月 31 日
PHP strtotime関数でハマった!(翌月の表現の処理)
PHPには strtotimeという関数があります。引数に例えば「+1 month」と指定すれば1ヶ月後のタイムスタンプを返してくれます。
<?php $nextmanth = date("Y-m", strtotime("+1 month"));?>
で翌月を返してくれると思ってました。しかし甘かった!!
例えば今月28日の時点では問題なかったのですが、
例:2009年1月28日の時点 <?php $nextmonth = date("Y-m", strtotime("+1 month")); echo $nextmonth;?> 結果:2009-02
これが31日では
例:2009年1月31日の時点 <?php $nextmonth = date("Y-m", strtotime("+1 month")); echo $nextmonth; ?> 結果:2009-03
となってしまう。
なぜならば、strtotime関数では1月31日の1ヶ月後は2月31日で2月は31日が存在しないので3月3日という認識らしい。
実際に以下のコードを実行すると
例:2009年1月31日の時点 <?php $nextmonth = date("Y-m-d", strtotime("+1 month")); echo $nextmonth;?> 結果:2009-03-03
となってしまう。
1月31日では「次の月」を3月と返してしまってくれていて、原因を突き止めるのに苦労しました。
正解は
例:2009年1月31日の時点 <?php $nextmonth = date("Y-m", strtotime(date("Y-m-01") . "+1 month")); echo $nextmonth; ?> 結果:2009-02
いったん「2009-01-01」と月初に戻してから、「+1 month」してやるとうまくいきました。
[...] PHP strtotime関数でハマった!(翌月の表現の処理) [...]