代码之家  ›  专栏  ›  技术社区  ›  fredley

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

  •  44
  • fredley  · 技术社区  · 14 年前

    有使用方法吗 strtotime 要将工作日(星期一到星期五)添加到日期中吗?或者其他方法?我想做的是:

    date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
    
    6 回复  |  直到 6 年前
        1
  •  93
  •   John Giotta iaforek    14 年前

    如果限制为工作日,请使用字符串weekdays。

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

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

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

        2
  •  2
  •   mpickens    11 年前

    我发现这辆小车需要更多的工作日。我在找当月1号之后的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);
        }
    
        3
  •  2
  •   ghindows    6 年前

    对于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;
    
    }
    
        4
  •  0
  •   CSelcukB    8 年前

    我认为一个函数可以很容易地开发出来,你可以只导出当前的一周中的第几天,你可以添加两个,5的mod可以很容易地给你工作日。

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

    您可以使用数组导出工作日名称,也可以使用此方法。

        5
  •  0
  •   Pedro H. de França    7 年前

    我递归地做,为我工作

    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');
    
        6
  •  0
  •   ram    7 年前

    对于旧版本的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;
    
    }