備忘録

開発の日々の備忘録

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"));

つかれた