月の最後の日をPHPで簡単に知る方法

集計系の処理のプログラムを開発していると、その月の最後の日を求める必要がちょくちょくあったりしませんか? 私はあります。さてそういう時にどうやって求めるでしょう。答えは一発↓

<?php
$d = date('Y-m-t');

これだけですw

書式「t」って何ですか?

恥ずかしながら date() 関数の書式に使える「t」の存在を今日まで知りませんでした。意味としては以下になっています。

t : 指定した月の日数。

t は DateTime クラスにも使えます。
例えば今年の各月に対して最終日を求めるのには、以下のようにします。

<?php
$d = new DateTime();
$year = 2012;
foreach (range(1, 12) as $month) {
    $d->setDate($year, $month, 1);
    echo $d->format('Y-m-t') . "\n";
}

従来はどうやっていた?

t フォーマットを知る前の従来のセオリーはこうでした。

  1. その月の最初の日(1日)を求める
  2. それに "+1 month" する
  3. それにさらに "-1 day" する

コードで書くとこんな感じ。

<?php
$d = new DateTime();
$d->setDate($d->format('Y'), $d->format('m'), 1);
$d->modify('+1 month -1 day');
echo $d->format('Y-m-d');

おまけ

PHPマニュアル「相対的な書式」をつらつら見てたら

<?php
$d = new DateTime('last day of 2012-06');
echo $d->format('Y-m-d');

とかでもいいんじゃね? とか思った。ダメじゃんオレw