てっくめも

主に技術的なことをつらつらと

PHPの日付関数の注意点

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等でも同様の問題が発生します。