Подтвердить что ты не робот

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

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

date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
4b9b3361

Ответ 1

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

echo date ( 'Y-m-j' , strtotime ( '3 weekdays' ) );

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

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

Ответ 2

Я нашел эту ошибку при необходимости большего количества будних дней. Я искал 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);
    }

Ответ 3

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

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

    return $workDayToProcess % 5;
}

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

Ответ 4

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

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');

Ответ 5

Для более старых версий 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;

}