PHPで日付操作するときのアンチパターン

どんな言語であっても、日付を扱うのは何かと厄介なのものです。

例えば、PHPで先月末日をyyyymmdd形式で表示したい場合。ググってみると以下のような書き方をしているサイトをチラホラ見かけます。

<?php
echo date('Y-m-t', strtotime('-1 month', strtotime(date('Y-m-1'))));
// 2017-02-28

動作は問題ない、けどちょっとこれは乱暴すぎでは?最低でも以下のように書くべきだと思います。

<?php
echo date('Y-m-d', strtotime('last day of last month'));
// 2017-02-28

この書き方は何かと便利なので覚えておいたほうがいいです。

<?php
$now = time();
$yesterday1 = date('Y-m-d', strtotime('-1 day', $now));
$yesterday2 = date('Y-m-d', strtotime('yesterday', $now));
// $yesterday1 === $yesterday2

PHP: 相対的な書式 - Manual


まあでもdate()とstrtotime()よりも、DateTimeクラスのほうが何かと捗ります。

<?php
$date = new DateTime('last day of last month');
echo $date->format('Y-m-d');
// 2017-02-28

date()はタイムゾーンがサーバ依存になってしまいますので、Webアプリ的な意味では正直言って論外です。strtotime()に関してはバッファオーバーフローするなどのバグで有名ですし。

date()とstrtotime()を使いまくっているソースを見かけた際には、ぜひプルリクしてあげてください。