Есть ли способ использовать strtotime
для добавления рабочих дней (с понедельника по пятницу) к дате? Или какой-то другой метод? Я хочу сделать это:
date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
Есть ли способ использовать strtotime
для добавления рабочих дней (с понедельника по пятницу) к дате? Или какой-то другой метод? Я хочу сделать это:
date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
Если вы ограничиваете будние дни, используйте строковые будни.
echo date ( 'Y-m-j' , 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 M-F
$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 ( 'Y-m-d' , 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;
}