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
まあでも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()を使いまくっているソースを見かけた際には、ぜひプルリクしてあげてください。