指定した年月の第[1-5][日-土]曜日の日付を求める

第38回 PHP 勉強会の id:hnw さんの発表資料を読んでみました。
http://d.hatena.ne.jp/hnw/20081220

PHP はバージョンごとに細かい仕様変更、修正があることが多いので、できる限り前バージョンをそろえるのには同意です。

例として、strtotime() の問題について指摘されていましたが、興味深いですね。
「12月の第3日曜日」を求める方法は?ということで、昔に第2月曜日/第3月曜日を計算するために関数を作成した覚えがあったので探してみたところ、以下のような関数を使っていました。
今だともっと簡単な方法があるのかもしれませんが・・・。

<?php

/**
 * 指定した年月の第[1-5][日-土]曜日の日付を求める
 */
function calc_day( $year, $month, $week_of_month, $day_of_the_week )
{
    if ( $week_of_month <= 0 ) {
        return FALSE;
    }

    switch ( strtolower( $day_of_the_week ) ) {
    case 'sun' : $wnum = 0; break;
    case 'mon' : $wnum = 1; break;
    case 'tue' : $wnum = 2; break;
    case 'wed' : $wnum = 3; break;
    case 'thu' : $wnum = 4; break;
    case 'fri' : $wnum = 5; break;
    case 'sat' : $wnum = 6; break;
    default: return FALSE;
    }

    $base_day = $week_of_month * 7;
    $diff_day = $base_day - $wnum;
    $result   = $base_day - (int)date( 'w', mktime( 0, 0, 0, $month, $diff_day, $year ) );

    if ( ! checkdate( $month, $result, $year ) ) {
        return FALSE;
    }
    return $result;
}

使用例としては、2008/12 の第3日曜日を求める場合、以下のようにします。

echo calc_day( 2008, 12, 3, 'Sun' );

ちなみに、今使っている Linux に入っている PHP のバージョンリストはこんな感じでした。