PHPの日付処理でハマったはなし
PHPで開発中に前月の月初日を取得する必要があって、ハマってしまった話です。
実行環境
# /usr/local/bin/php -v PHP 7.0.3 (cli) (built: Feb 10 2016 16:03:28) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
実際に書いたコードはこんな感じ。
#!/usr/local/bin/php <?php echo "今日".date("Y-m-d"); echo "\n"; echo "先月の月初".date("Y-m-01",strtotime("-1 month")); echo "\n";
結果
今日2016-07-31 先月の月初2016-07-01
んんん?先月の月初は2016-06-01じゃないの!?
ぶつぶつ言いながら更に検証。
#!/usr/local/bin/php <?php echo "今日".date("Y-m-d"); echo "\n"; echo "先月".date("Y-m-d",strtotime("-1 month")); echo "\n"; echo "先々月".date("Y-m-d",strtotime("-2 month")); echo "\n";
結果
今日2016-07-31 先月2016-07-01 先々月2016-05-31
あらら。
2016-07-31の"-1 month"は"2016-07-01"こういうことらしい。
最初に書いたコードは実行する日によって当月を返したり、前月を返したりしてた模様。
どうやら前月を正しくとるには、strtotime関数の起点とする日付に月初の日付を渡してやれば良いらしい 。
修正。
#!/usr/local/bin/php <?php echo "今日".date("Y-m-d"); echo "\n"; echo "先月の月初".date("Y-m-d",strtotime(date("Y-m-01")." -1 month")); echo "\n"; echo "先々月の月初".date("Y-m-d",strtotime(date("Y-m-01")." -2 month")); echo "\n";
結果
今日2016-07-31 先月の月初2016-06-01 先々月の月初2016-05-01
とりあえず、前月の月初はこれでとれるようになった模様
echo date("Y-m-d",strtotime(date("Y-m-01")." -1 month"));
つかれた