PHPのstrtotime()で一か月前の月を取ろうとしてバグ | プログラマのメモ

PHPのstrtotime()で一か月前の月を取ろうとしてバグ

PHPのstrtotime()を使って一か月前の月を取ろうと思い以下のようなコードを書きました。

echo date("Y-m", strtotime("-1 month"));

何の問題も無いように見えますが、これだと思ったように月が取れない場合があります。

この処理を2016年5月31日に動かすと、結果は
> 2016-04
となってほしいですが、実際は
> 2016-05
となってしまいます。

これはstrtotimeが「5月31日の一か月前は4月31日やな!」と解釈するためっぽく、
4月は30日までしかないので、「4月31日という事は5月1日という事やな!」と判断されて、
月だけ取り出すと2016年5月という結果になってしまうようです。

これを回避するために現在日時をベースに「-1 month」とするのはやめましょう。
そういうコードを見たらレビューで指摘してあげましょう。

いかようにすると平気です。(試してないのであとで試す)

echo date("Y-m", strtotime(date("Y-m-01")." -1 month"));