Другой способ - узнать, какой сегодня день недели, найти первый такой день месяца с помощью некоторого волшебства strtotime()
, а затем вычислить разницу между этим и текущим в неделях. Ниже приведена информация о функции, которая будет принимать Y-m-d
в формате date()
и возвращать, какой это день недели месяца.
Примечание: strtotime
должно быть многословным, включая "of" и месяц: "первый понедельник 2011-02", в противном случае он продвигается на один день . Это укусило меня, когда я тестировал крайние случаи.
Также добавлен дисплей с перцем, который совершенно необязателен, но мне это нравилось.
function nthWeekdayOfMonth($day) {
$dayTS = strtotime($day) ;
$dayOfWeekToday = date('l', $dayTS) ;
$firstOfMonth = date('Y-m', $dayTS) . "-01" ;
$firstOfMonthTS = strtotime($firstOfMonth) ;
$firstWhat = date('Y-m-d', strtotime("first $dayOfWeekToday of $monthYear", $firstOfMonthTS)) ;
$firstWhatTS = strtotime($firstWhat) ;
$diffTS = $dayTS - $firstWhatTS ;
$diffWeeks = $diffTS / (86400 * 7);
$nthWeekdayOfMonth = $diffWeeks + 1;
return $nthWeekdayOfMonth ;
}
$day = date('Y-m-d') ;
$nthWeekdayOfMonth = nthWeekdayOfMonth($day) ;
switch ($nthWeekdayOfMonth) {
case 1:
$inflector = "st" ;
break ;
case 2:
$inflector = "nd" ;
break ;
case 3:
$inflector = "rd" ;
break ;
default:
$inflector = "th" ;
}
$dayTS = strtotime($day) ;
$monthName = date('F', $dayTS) ;
$dayOfWeekToday = date('l', $dayTS) ;
echo "Today is the {$nthWeekdayOfMonth}$inflector $dayOfWeekToday in $monthName" ;