PHPの日付関数について、1年前や1ヶ月前等の日付等を求める場合に、感覚的な日付計算とは違う動きをするので注意が必要です。
うるう年の前の年の2/29を取得しようとした場合
サンプルコード
$a = date('Y-m-d', mktime(0, 0, 0, 2, 29, 2012));
echo '$a = ' . $a;
$b = date('Y-m-d', mktime(0, 0, 0, 2, 29, 2012-1)); // 1年前の同日を取得
echo '$b = ' . $b;
結果
$a = 2012-02-29
$b = 2011-03-01
2/29の1年前なので、2/28が取得できそうな気がするが、実際は3/1が返却される。
31日終わりの月の1ヶ月前を取得しようとした場合
サンプルコード
$c = date('Y-m-d', mktime(0, 0, 0, 10, 31, 2011));
echo '$c = ' . $c;
$d = date('Y-m-d', mktime(0, 0, 0, 10-1, 31, 2011)); // 1ヶ月前の同日を取得
echo '$d = ' . $d;
結果
$c = 2011-10-31
$d = 2011-10-01
10/31の1ヶ月前なので、9/30が取得できそうな気がするが、実際は10/1が返却される。
回避策
下記のように、取得したい月の翌月月初から-1日する事
サンプルコード
$e = date('Y-m-d', mktime(0, 0, 0, 10, 31, 2011));
echo '$e = ' . $e;
$f = date('Y-m-d', mktime(0, 0, 0, 10, 1-1, 2011));
echo '$f = ' . $f;
結果
$e = 2011-10-31
$f = 2011-09-30
※今回はmktimeを用いましたが、strtotime等でも同様の問題が発生します。