PHP中的工作日(周一至周五)

48

有没有办法使用strtotime来为日期添加工作日(周一至周五)?或者其他方法?我的目标是:

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

9
在一些中东国家,一周的周末是从星期天到星期四。你有没有考虑过这一点呢?:O - Russell Dias
4
这是用于计算本地活动付款截止日期距离未来的天数,所以不需要 :-) - fredley
你也必须考虑假期。 - yvoyer
@fredley 假期是个问题吗? - Pekka
1
是的,工作日是主观的。 - John Giotta
@Pekka 不,预订系统只会开放有限的时间。 - fredley
7个回答

114

如果你限制只在工作日使用,请使用字符串“weekdays”。

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

这将使你提前3个工作日,所以如果今天是星期四,它会添加额外的周末时间。

来源:http://www.php.net/manual/en/datetime.formats.relative.php


57
没门。这个可行吗?有什么 strtotime() 办不到的吗? - Pekka
2
尽管它有缺陷:echo date('Y-m-d', strtotime('2011-03-27 + 5 weekdays')); 预期是4月1日,但实际得到的是4月3日。 - zerkms
1
比较"+4个工作日"和"+5"。差异是错误的。如果你加上"H:i:s",你会发现这个问题与时间无关。 - zerkms
1
@fab 2011年4月1日是星期五。 - JMTyler
1
可以运行。今天是星期日,这段代码给我上周五的日期 date('Y-m-d', strtotime('-1 weekdays')) - Ali Han
显示剩余7条评论

3

2

对于 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

当需要较多的工作日时,我发现这个存在缺陷。我正在寻找当前月份第一天之后 X 个工作日。

起初看起来很不错,但在添加了大于 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
我认为可以轻松开发一个函数,你只需要导出当前星期几的编号,然后加上2并对5取模,就可以轻松得到工作日。
function increaseWorkDay($workDayToProcess, $dayToAdd){
    if($workDayToProcess >= 4 && $workDayToProcess <= 6){
        $workDayToProcess= 4;
    }
    $workDayToProcess+= $dayToAdd;

    return $workDayToProcess % 5;
}

你可以使用数组导出星期几的名称,这种方法也可以选择使用。


0

我用递归做了,对我有用

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

对于 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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接