PHP で先月の日付を出そうとしてたんだけど想定通りに動かなかった。
/* 今日は5月31日 */
php > var_dump(date('Y-m-d'));
string(10) "2013-05-31"
/* 先月を出そうと strtotime に last month を指定 */
php > var_dump(date('Y-m-d', strtotime('last month')));
string(10) "2013-05-01"
先月を指定したのに今月の頭になってる・・・
どうやらこの strtotime での月の加算減算処理、単純に月の数値を増やしたり減らしたりしているらしい。つまり、5月31日の時点で -1 month とすると、4月31日と認識され、そんな日は無いから5月1日に繰り上がっちゃうわけだ。
DateTime::sub() を試してみた
この関数を使って日付の足し算や引き算を行うことはおすすめできません。 PHP 5.3 以降なら DateTime::add() や DateTime::sub() を、そして PHP 5.2 なら DateTime::modify() を使いましょう。
とあるように DateTime を使ってみた。
php > $date = new Datetime('2013-05-31 12:00:00');
php > $date->sub(new DateInterval('P1M'));
php > var_dump($date->format('Y-m-d'));
string(10) "2013-05-01"
結果変わらないやん・・・
これも strtotime と同様に単純に月を -1 した値を返してくる様だ。簡単にはいかない。
解決策
strtotime と date 関数を使うなら以下のようにすれば先月の月が取れる。自分は今回月だけわかればいいのでこうした。
php > var_dump(date('Y-m-d', strtotime(date('Y-m-1') . ' -1 month')));
string(10) "2013-04-01"
これでひとまずOK
ちなみに PHP 限定で書いたけど他の言語は見てないです。。。どうなんでしょう。