Определить “первый понедельник месяца” PHP
/** * @param integer $weekNumber Номер недели. * @param integer $dayOfWeek Порядковый номер дня недели. * @param integer $monthNumber Порядковый номер месяца. * @param integer $year Год. * @return integer День месяца. */ function compute_day($weekNumber, $dayOfWeek, $monthNumber, $year) { // порядковый номер дня недели первого дня месяца $monthNumber $dayOfWeekFirstDayOfMonth = date('w', mktime(0, 0, 0, $monthNumber, 1, $year)); // сколько дней осталось до дня недели $dayOfWeek относительно дня недели $dayOfWeekFirstDayOfMonth $diference = 0; // если нужный день недели $dayOfWeek только наступит относительно дня недели $dayOfWeekFirstDayOfMonth if ($dayOfWeekFirstDayOfMonth <= $dayOfWeek) { $diference = $dayOfWeek - $dayOfWeekFirstDayOfMonth; } // если нужный день недели $dayOfWeek уже прошёл относительно дня недели $dayOfWeekFirstDayOfMonth else { $diference = 7 - $dayOfWeekFirstDayOfMonth + $dayOfWeek; } return 1 + $diference + ($weekNumber - 1) * 7; }
// первый понедельник января 2011 echo compute_day(1, 1, 1, 2011); // 3 // второе воскресенье декабря 2011 echo compute_day(2, 7, 12, 2011); // 11 // третья суббота июля 2011 echo compute_day(3, 6, 7, 2011); // 16