Похоже, небезопасно полагаться на strtotime, чтобы иметь дело с вычислениями порядковых дат - по крайней мере, в версиях PHP <5.3.(Я тестировал с 5.2.9 и 5.2.11, и ни один из них не работает, несмотря на утверждение в онлайн-документации о том, что ошибка была исправлена в 5.2.7.) </p>
Добавление «of», как предполагается, очевидно, работает толькоphp 5.3+ и полное удаление порядкового номера вернет «первое» вхождение, но остальные порядковые номера будут выходными на 7 дней.
Лучшее решение для PHP 5.2 выглядит примерно так:
$recurrOrdinal = "last";
$dayOfWeek = "Thursday";
$monthYear = "March 2011";
echo ordinalDate($recurrOrdinal, $dayOfWeek, $monthYear);
function ordinalDate($recurrOrdinal, $dayOfWeek, $monthYear) {
$firstDate = date("j", strtotime($dayOfWeek . " " . $monthYear) );
if ($recurrOrdinal == "first")
$computed = $firstDate;
elseif ($recurrOrdinal == "second")
$computed = $firstDate + 7;
elseif ($recurrOrdinal == "third")
$computed = $firstDate + 14;
elseif ($recurrOrdinal == "fourth")
$computed = $firstDate + 21;
elseif ($recurrOrdinal == "last") {
if ( ($firstDate + 28) <= date("t", strtotime($monthYear)) )
$computed = $firstDate + 28;
else
$computed = $firstDate + 21;
}
return date("Y-m-d", strtotime($computed . " " . $monthYear) );
}