LoginSignup
14
14

More than 5 years have passed since last update.

PHPの日付関数の注意点

Posted at

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

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14