Рабочие дни (пн-пт) в PHP

Есть ли способ использовать strtotime для добавления рабочих дней (с понедельника по пятницу) к дате? Или какой-то другой метод? Я хочу сделать следующее:

 date ( 'Ymj' , strtotime ( '+3 working days' ) ) 

Если вы ограничиваете будние дни, используйте строковые будни.

 echo date ( 'Ymj' , strtotime ( '3 weekdays' ) ); 

Это должно подтолкнуть вас вперед на 3 рабочих дня, поэтому, если в четверг это добавит дополнительное время выходного дня.

Источник: http://www.php.net/manual/en/datetime.formats.relative.php

Я обнаружил эту ошибку при необходимости большего количества рабочих дней. Я искал X рабочих дней после 1-го числа текущего месяца.

Выглядел отлично, пока не добавил 5 рабочих дней (похоже на то, что нашел @zerkms).

Это оказалось более точным для меня.

  function _getBusinessDayOfMonth( $days ) { $time = strtotime(date("m/1/Y 00:00")); //finding # of business days after 1st of the month $i = 0; //start with zero while ($i < $days) { //loop through until reached the amount of weekdays $time = strtotime("+1 day", $time); //Increase day by 1 if (date("N", $time) < 6) { //test if MF $i++; //Increase by 1 } } echo date("m/d/Y", $time); } 

Я думаю, что функция может быть легко разработана, что вы можете просто экспортировать текущий день недели недели, и вы можете добавить два, а мода 5 даст вам легко будний день.

 function increaseWorkDay($workDayToProcess, $dayToAdd){ if($workDayToProcess >= 4 && $workDayToProcess <= 6){ $workDayToProcess= 4; } $workDayToProcess+= $dayToAdd; return $workDayToProcess % 5; } 

И вы можете экспортировать имя дня недели с помощью массива, этот метод можно альтернативно использовать.

Я делаю это рекурсивно, работал на меня

 function add_work_days($date, $day){ if($day == 0) return $date; $date->add(new DateInterval('P1D')); if(!in_array($date->format('N'), array('6', '7'))) $day--; return add_work_days($date, $day); } $date = add_work_days(new DateTime(), 3); echo $date->format('d/m/Y'); 

Для более старых версий PHP <5.3

 function AddWorkingDays($startDate, $adddays) { $retdate = $startDate; $sign = "+"; if($adddays < 0){ $adddays = $adddays*-1; $sign = "-"; } while ($adddays > 0) { $retdate = date ( 'Ymd' , strtotime ( "$retdate {$sign}1 day" ) ); $what_day = date("N", strtotime($retdate)); if ( $what_day != 6 && $what_day != 7 ) // 6 and 7 are weekend $adddays--; }; return $retdate; }