Возможный дубликат:
Получайте количество будних дней в данном месяце
Как рассчитать рабочие дни любого месяца? cal_days_in_month
возвращает просто общее количество дней в месяц. Моя задача – рассчитать количество дней в месяце, кроме как по субботам, так и по воскресеньям или воскресеньям. Любой способ найти это?
function countDays($year, $month, $ignore) { $count = 0; $counter = mktime(0, 0, 0, $month, 1, $year); while (date("n", $counter) == $month) { if (in_array(date("w", $counter), $ignore) == false) { $count++; } $counter = strtotime("+1 day", $counter); } return $count; } echo countDays(2013, 1, array(0, 6)); // 23
Функция date
используется в этом примере. Замечание о параметре игнорирования: 0 – воскресенье, …, 6 – суббота.
копирование второго ответа из: Получить количество будних дней в данном месяце
Вам не нужно подсчитывать каждый день в месяце. Вы уже знаете, что первые 28 дней содержат 20 рабочих дней независимо от того, что. Все, что вам нужно сделать, это определить последние несколько дней. Измените начальное значение на 29. Затем добавьте 20 рабочих дней к возвращаемому значению.
function get_weekdays($m,$y) { $lastday = date("t",mktime(0,0,0,$m,1,$y)); $weekdays=0; for($d=29;$d<=$lastday;$d++) { $wd = date("w",mktime(0,0,0,$m,$d,$y)); if($wd > 0 && $wd < 6) $weekdays++; } return $weekdays+20; }
Это должно решить вашу проблему и действительно является эффективным решением.
Простым (не очень элегантным) ответом было бы просто создать отметку времени в первый день месяца, использовать дату (), чтобы получить физическое имя месяца, затем либо переключиться, либо определить, является ли это рабочим днем или нет ,
$myTime = strtotime("1/1/2013"); // Use whatever date format you want $daysInMonth = cal_days_in_month(CAL_GREGORIAN, 1, 2013); // 31 $workDays = 0; while($daysInMonth > 0) { $day = date("D", $myTime); // Sun - Sat if($day != "Sun" && $day != "Sat") $workDays++; $daysInMonth--; $myTime += 86400; // 86,400 seconds = 24 hrs. } echo "There are $workDays work days this month!";
Вывод
There are 23 work days this month!
Просто выполните поиск в Google, мужик.
Для потомков ваш алгоритм:
function countDays($y, $m, $ignore = false) { $result = 0; $loop = strtotime("$y-$m-01"); do if(!$ignore or !in_array(strftime("%u",$loop),$ignore)) $result++; while(strftime("%m",$loop = strtotime("+1 day",$loop))==$m); return $result; } echo countDays(2013,1,array(6,7));//23 echo countDays(2013,2);//28