Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中给定日期的下一个工作日_Php_Date_Next - Fatal编程技术网

PHP中给定日期的下一个工作日

PHP中给定日期的下一个工作日,php,date,next,Php,Date,Next,有人有PHP代码段来计算给定日期的下一个工作日吗? 例如,需要如何转换YYYY-MM-DD以确定下一个工作日 例如: 2011年4月3日(DD-MM-YYYY)的下一个工作日为2011年4月4日。 2011年4月8日的下一个营业日为2011年4月11日 这是一个变量,包含我需要知道的下一个工作日的日期 $cubeTime['time']; 变量包含:2011-04-01 代码片段的结果应该是:2011-04-04您需要做的是: 将提供的日期转换为时间戳 将此命令与或w或NPHP格式化程序命令一

有人有PHP代码段来计算给定日期的下一个工作日吗? 例如,需要如何转换YYYY-MM-DD以确定下一个工作日

例如: 2011年4月3日(DD-MM-YYYY)的下一个工作日为2011年4月4日。 2011年4月8日的下一个营业日为2011年4月11日

这是一个变量,包含我需要知道的下一个工作日的日期

$cubeTime['time'];
变量包含:2011-04-01
代码片段的结果应该是:2011-04-04

您需要做的是:

  • 将提供的日期转换为时间戳

  • 将此命令与或
    w
    N
    PHP格式化程序命令一起使用,可以告诉您一周中的哪一天

  • 如果不是“工作日”,则可以将时间戳增加一天(86400秒),然后再次检查,直到到达工作日


  • 注意:由于这是真正的工作,您还需要排除任何银行或公共假日等。

    下一个工作日

    这将查找特定日期(不包括周六或周日)后的下一个工作日:

    当然,您也可以使用日期变量:

    $myDate = '2011-04-05';
    echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));
    
    更新:或者,如果您有权访问(很可能):


    想跳过假期吗?:

    虽然最初的海报提到“我不需要考虑假期”,但是如果你确实想忽略假日,记住“假日”只是一个你不想包括的日期的数组,不同的是国家、地区、公司、人……等等。 只需将上述代码放入一个函数,该函数排除/循环不希望包含的日期。大概是这样的:

    $tmpDate = '2015-06-22';
    $holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
    $i = 1;
    $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
    
    while (in_array($nextBusinessDay, $holidays)) {
        $i++;
        $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
    }
    
    我相信上面的代码可以简化或缩短,如果你想。我试着用一种容易理解的方式写它

    function next_business_day($date) {
      $add_day = 0;
      do {
        $add_day++;
        $new_date = date('Y-m-d', strtotime("$date +$add_day Days"));
        $new_day_of_week = date('w', strtotime($new_date));
      } while($new_day_of_week == 6 || $new_day_of_week == 0);
    
      return $new_date;
    }
    

    此函数应忽略周末(6=周六,0=周日)。

    此函数将计算未来或过去的工作日。参数是天数、向前(1)或向后(0)以及日期。如果未提供日期,将使用今天的日期:

    // returned $date Y/m/d
    function work_days_from_date($days, $forward, $date=NULL) 
    {
        if(!$date)
        {
            $date = date('Y-m-d'); // if no date given, use todays date
        }
    
        while ($days != 0) 
        {
            $forward == 1 ? $day = strtotime($date.' +1 day') : $day = strtotime($date.' -1 day');
            $date = date('Y-m-d',$day);
            if( date('N', strtotime($date)) <= 5) // if it's a weekday
            {
              $days--;
            }
        }
        return $date;
    }
    
    //返回$date Y/m/d
    函数工作日自日期($days,$forward,$date=NULL)
    {
    如果(!$日期)
    {
    $date=date('Y-m-d');//如果没有给出日期,请使用今天的日期
    }
    而($days!=0)
    {
    $forward==1?$day=strottime($date.'+1天'):$day=strottime($date.'-1天');
    $date=日期('Y-m-d',$day);
    
    如果(date('N',strotime($date))我在一个丹麦网站上工作时遇到了这个问题,当时我需要编写一个“次日交付”PHP脚本

    以下是我的想法(这将以丹麦语显示下一个工作日的名称,如果当前时间超过给定限制,则显示下一个工作日+1)

    $day[“Mon”]=“Mandag”;
    $day[“Tue”]=“Tirsdag”;
    $day[“Wed”]=“Onsdag”;
    $day[“Thu”]=“Torsdag”;
    $day[“Fri”]=“Fredag”;
    $day[“Sat”]=“Lørdag”;
    $day[“Sun”]=“Søndag”;
    日期默认时区设置(“欧洲/哥本哈根”);
    $date=日期('l');
    $checkTime='1400';
    $date2=日期(strotime($date.'+1个工作日');
    如果(日期('Hi')>=$checkTime){
    $date2=日期(strotime($date.+2个工作日));
    }
    如果(日期('l')='Saturday'){
    $date2=日期(strotime($date.+2个工作日));
    }
    如果(日期('l')='Sunday'){
    $date2=日期(strotime($date.+2个工作日));
    }
    回音“Næste levering:”.$day[date(“D”),$date2)]。

    正如您在示例代码中所看到的,$checkTime是我设置时间限制的地方,它决定了第二天交付是+1个工作日还是+2个工作日

    “1400”=14:00小时

    我知道if语句可以进行更大的压缩,但我展示了我的代码,以便于人们理解它的工作方式


    我希望有人能使用这个小片段。

    对于英国假期,你可以使用它

    ICS格式的数据很容易解析。我的建议是

    # $date must be in YYYY-MM-DD format
    # You can pass in either an array of holidays in YYYYMMDD format
    # OR a URL for a .ics file containing holidays
    # this defaults to the UK government holiday data for England and Wales
    function addBusinessDays($date,$numDays=1,$holidays='') {
        if ($holidays==='') $holidays = 'https://www.gov.uk/bank-holidays/england-and-wales.ics';
    
        if (!is_array($holidays)) {
            $ch = curl_init($holidays);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
            $ics = curl_exec($ch);
            curl_close($ch);
            $ics = explode("\n",$ics);
            $ics = preg_grep('/^DTSTART;/',$ics);
            $holidays = preg_replace('/^DTSTART;VALUE=DATE:(\\d{4})(\\d{2})(\\d{2}).*/s','$1-$2-$3',$ics);
        }
    
        $addDay = 0;
        while ($numDays--) {
            while (true) {
                $addDay++;
                $newDate = date('Y-m-d', strtotime("$date +$addDay Days"));
                $newDayOfWeek = date('w', strtotime($newDate));
                if ( $newDayOfWeek>0 && $newDayOfWeek<6 && !in_array($newDate,$holidays)) break;
            }
        }
    
        return $newDate;
    }
    
    #$date必须为YYYY-MM-DD格式
    #您可以传入YYYYMMDD格式的假日数组
    #或包含假日的.ics文件的URL
    #这默认为英格兰和威尔士的英国政府假日数据
    函数addBusinessDays($date,$numDays=1,$holidays=''){
    如果($holidays=='')$holidays=''https://www.gov.uk/bank-holidays/england-and-wales.ics';
    如果(!is_数组($holidays)){
    $ch=curl_init($节假日);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $ics=curl_exec($ch);
    卷曲关闭($ch);
    $ics=爆炸(“\n”,$ics);
    $ics=preg_grep(“/^DTSTART;/”,$ics);
    $holidays=preg_replace('/^DTSTART;VALUE=DATE:(\\d{4})(\\d{2})(\\d{2})。*/s','1-$2-$3',$ics);
    }
    $addDay=0;
    而($numDays--){
    while(true){
    $addDay++;
    $newDate=date('Y-m-d',strottime($date+$addDay天));
    $newDayOfWeek=日期('w',strotime($newDate));
    如果($newDayOfWeek>0&&$newDayOfWeek请参见以下示例:

    $startDate = new DateTime( '2013-04-01' );    //intialize start date
    $endDate = new DateTime( '2013-04-30' );    //initialize end date
    $holiday = array('2013-04-11','2013-04-25');  //this is assumed list of holiday
    $interval = new DateInterval('P1D');    // set the interval as 1 day
    $daterange = new DatePeriod($startDate, $interval ,$endDate);
    foreach($daterange as $date){
    if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
    $result[] = $date->format("Y-m-d");
    }
    echo "<pre>";print_r($result);
    
    $startDate=new DateTime('2013-04-01');//初始化开始日期
    $endDate=新的日期时间('2013-04-30');//初始化结束日期
    $holiday=array('2013-04-11','2013-04-25');//这是假定的假日列表
    $interval=new DateInterval('P1D');//将间隔设置为1天
    $daterange=新的日期周期($startDate,$interval,$endDate);
    foreach($daterange作为$date){
    如果($date->format(“N”)format(“Y-m-d”),$holiday))
    $result[]=$date->format(“Y-m-d”);
    }
    回显“;打印($result);
    

    更多信息:

    您可以这样做

    string(10) "2017-02-27"
    

    \NavigableDate\NavigableDateFacade::create($date,$DateTimeZone)
    由位于的php库提供。您需要首先通过composer或直接下载将此库包含在项目中。

    我在php中使用了以下方法,strottime()在闰年2月不起作用

    //
    while ($date->format('N') >= 5 && !in_array($date->format('Y-m-d'), self::holidayArray()))
    

    下面是用PHP获取工作日(周一至周五)的最佳方法

    希望这是w
    $startDate = new DateTime( '2013-04-01' );    //intialize start date
    $endDate = new DateTime( '2013-04-30' );    //initialize end date
    $holiday = array('2013-04-11','2013-04-25');  //this is assumed list of holiday
    $interval = new DateInterval('P1D');    // set the interval as 1 day
    $daterange = new DatePeriod($startDate, $interval ,$endDate);
    foreach($daterange as $date){
    if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
    $result[] = $date->format("Y-m-d");
    }
    echo "<pre>";print_r($result);
    
    /**
     * @param string $date
     * @param DateTimeZone|null|null $DateTimeZone
     * @return \NavigableDate\NavigableDateInterface
     */
    function getNextBusinessDay(string $date, ? DateTimeZone $DateTimeZone = null):\NavigableDate\NavigableDateInterface
    {
        $Date = \NavigableDate\NavigableDateFacade::create($date, $DateTimeZone);
    
        $NextDay = $Date->nextDay();
        while(true)
        {
            $nextDayIndexInTheWeek = (int) $NextDay->format('N');
    
            // check if the day is between Monday and Friday. In DateTime class php, Monday is 1 and Friday is 5
            if ($nextDayIndexInTheWeek >= 1 && $nextDayIndexInTheWeek <= 5)
            {
                break;
            }
            $NextDay = $NextDay->nextDay();
        }
    
        return $NextDay;
    }
    
    $date = '2017-02-24';
    $NextBussinessDay = getNextBusinessDay($date);
    
    var_dump($NextBussinessDay->format('Y-m-d'));
    
    string(10) "2017-02-27"
    
    public static function nextWorkingDay($date, $addDays = 1)
    {
        if (strlen(trim($date)) <= 10) {
            $date = trim($date)." 09:00:00";
        }
    
        $date = new DateTime($date);
        //Add days
        $date->add(new DateInterval('P'.$addDays.'D'));
    
        while ($date->format('N') >= 5)
        {
            $date->add(new DateInterval('P1D'));
        }
    
        return $date->format('Y-m-d H:i:s');
    }
    
    //
    while ($date->format('N') >= 5 && !in_array($date->format('Y-m-d'), self::holidayArray()))
    
    function days()
    {
        $week=array();
        $weekday=["Monday","Tuesday","Wednesday","Thursday","Friday"];
    
        foreach ($weekday as $key => $value) 
        {
            $sort=$value." this week";
            $day=date('D', strtotime($sort)); 
            $date=date('d', strtotime($sort)); 
            $year=date('Y-m-d', strtotime($sort)); 
    
            $weeks['day']= $day;
            $weeks['date']= $date;
            $weeks['year']= $year;
    
            $week[]=$weeks;
        } 
        
        return $week;
    }