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

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

44 голосов
/ 24 ноября 2010

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

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

Ответы [ 6 ]

94 голосов
/ 24 ноября 2010

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

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

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

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

2 голосов
/ 19 апреля 2018

для PHP> = 5,6

public function addWorkingDays($date, $day)
{

    if (!($date instanceof \DateTime) || is_string($date)) {
        $date = new \DateTime($date);
    }

    if ($date instanceof \DateTime) {
        $newDate = clone $date;
    }

    if ($day == 0) {
        return $newDate;
    }

    $i = 1;

    while ($i <= abs($day)) {

        $newDate->modify(($day > 0 ? ' +' : ' -') . '1 day');

        $next_day_number = $newDate->format('N');

        if (!in_array($next_day_number, [6, 7])) {
            $i++;
        }

    }

    return $newDate;

}
2 голосов
/ 28 июня 2013

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

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

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;

}
0 голосов
/ 11 августа 2017

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

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');
0 голосов
/ 21 сентября 2016

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

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

    return $workDayToProcess % 5;
}

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

...