【问题标题】:Return date interval excluding weekend function返回不包括周末功能的日期间隔
【发布时间】:2013-10-07 17:38:57
【问题描述】:

我在下面有这个函数来返回日期间隔。

function dateInterval($start, $end) { 

    $start1 = new DateTime($start);
    $end1 = new DateTime($end);
    $defaultStart = new DateTime('2005-01-01');
    $defaultEnd = new DateTime('2005-01-01');

    if ($start1 > $defaultStart || $end > $defaultEnd) {
        $days = round(($end1->format('U') - $start1->format('U')) / (60*60*24));
        return $days.'d';
    } else {
        $days = 'ND';
        return $days;
    }

}

我怎样才能让它不计算周末?

谢谢。

【问题讨论】:

标签: php date


【解决方案1】:

获取两个日期之间无节假日的工作日

使用示例:

echo number_of_working_days('2013-12-23', '2013-12-29');

输出:

3

Link to the function

【讨论】:

    【解决方案2】:

    这是我在互联网上找到的一个功能,它完全符合您的要求。

    <?php
    //The function returns the no. of business days between two dates and it skips the holidays
    function getWorkingDays($startDate,$endDate,$holidays){
        // do strtotime calculations just once
        $endDate = strtotime($endDate);
        $startDate = strtotime($startDate);
    
    
        //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24
        //We add one to inlude both dates in the interval.
        $days = ($endDate - $startDate) / 86400 + 1;
    
        $no_full_weeks = floor($days / 7);
        $no_remaining_days = fmod($days, 7);
    
        //It will return 1 if it's Monday,.. ,7 for Sunday
        $the_first_day_of_week = date("N", $startDate);
        $the_last_day_of_week = date("N", $endDate);
    
        //---->The two can be equal in leap years when february has 29 days, the equal sign is added here
        //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.
        if ($the_first_day_of_week <= $the_last_day_of_week) {
            if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--;
            if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--;
        }
        else {
            // (edit by Tokes to fix an edge case where the start day was a Sunday
            // and the end day was NOT a Saturday)
    
            // the day of the week for start is later than the day of the week for end
            if ($the_first_day_of_week == 7) {
                // if the start date is a Sunday, then we definitely subtract 1 day
                $no_remaining_days--;
    
                if ($the_last_day_of_week == 6) {
                    // if the end date is a Saturday, then we subtract another day
                    $no_remaining_days--;
                }
            }
            else {
                // the start date was a Saturday (or earlier), and the end date was (Mon..Fri)
                // so we skip an entire weekend and subtract 2 days
                $no_remaining_days -= 2;
            }
        }
    
        //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder
    //---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it
       $workingDays = $no_full_weeks * 5;
        if ($no_remaining_days > 0 )
        {
          $workingDays += $no_remaining_days;
        }
    
        //We subtract the holidays
        foreach($holidays as $holiday){
            $time_stamp=strtotime($holiday);
            //If the holiday doesn't fall in weekend
            if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
                $workingDays--;
        }
    
        return $workingDays;
    }
    
    //Example:
    
    $holidays=array("2008-12-25","2008-12-26","2009-01-01");
    
    echo getWorkingDays("2008-12-22","2009-01-02",$holidays)
    // => will return 7
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2011-03-22
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多