Get date range between two dates excluding weekends

后端 未结 4 1703
情话喂你
情话喂你 2020-11-29 06:16

Given the following dates:

6/30/2010 - 7/6/2010

and a static variable:

$h = 7.5

I need to create an array

相关标签:
4条回答
  • 2020-11-29 06:36

    The simplest method:

    $start = strtotime('6/30/2010');
    $end = strtotime('7/6/2010');
    $result = array();
    while ($start <= $end) {
        if (date('N', $start) <= 5) {
            $current = date('m/d/Y', $start);
            $result[$current] = 7.5;
        }
        $start += 86400;
    }
    print_r($result);
    

    UPDATE: Forgot to skip weekends. This should work now.

    0 讨论(0)
  • 2020-11-29 06:43

    This is gnud's answer but as a function (also added an option to exclude the current day from the calculation):

    (examples below)

    public function getNumberOfDays($startDate, $endDate, $hoursPerDay="7.5", $excludeToday=true)
    {
        // d/m/Y
        $start = new DateTime($startDate);
        $end = new DateTime($endDate);
        $oneday = new DateInterval("P1D");
    
        $days = array();
    
        /* Iterate from $start up to $end+1 day, one day in each iteration.
        We add one day to the $end date, because the DatePeriod only iterates up to,
        not including, the end date. */
        foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) {
            $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
            if($day_num < 6) { /* weekday */
                $days[$day->format("Y-m-d")] = $hoursPerDay;
            } 
        }    
    
        if ($excludeToday)
            array_pop ($days);
    
        return $days;       
    }
    

    And to use it:

    $date1 = "2012-01-12";
    $date2 = date('Y-m-d'); //today's date  
    
    $daysArray = getNumberOfDays($date1, $date2);
    
    echo 'hours: ' . array_sum($daysArray);
    echo 'days: ' . count($daysArray);
    
    0 讨论(0)
  • 2020-11-29 06:50

    For PHP >= 5.3.0, use the DatePeriod class. It's unfortunately barely documented.

    $start = new DateTime('6/30/2010');
    $end = new DateTime('7/6/2010');
    $oneday = new DateInterval("P1D");
    
    $days = array();
    $data = "7.5";
    
    /* Iterate from $start up to $end+1 day, one day in each iteration.
       We add one day to the $end date, because the DatePeriod only iterates up to,
       not including, the end date. */
    foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) {
        $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
        if($day_num < 6) { /* weekday */
            $days[$day->format("Y-m-d")] = $data;
        } 
    }    
    print_r($days);
    
    0 讨论(0)
  • 2020-11-29 06:54

    This is OOP approach, just in case. It returns an array with all of dates, except the weekends days.

        class Date{
            public function getIntervalBetweenTwoDates($startDate, $endDate){
                $period = new DatePeriod(
                     new DateTime($startDate),
                     new DateInterval('P1D'),
                     new DateTime($endDate)
                );
                $all_days = array();$i = 0;
                foreach($period as $date) {
                    if ($this->isWeekend($date->format('Y-m-d'))){
                        $all_days[$i] = $date->format('Y-m-d');
                        $i++;
                    }
                }
                return $all_days;
            }
            public function isWeekend($date) {
                $weekDay = date('w', strtotime($date));
                if (($weekDay == 0 || $weekDay == 6)){
                    return false;
                }else{
                    return true;
                }
            }
        }
        $d = new Date();
        var_dump($d->getIntervalBetweenTwoDates('2015-08-01','2015-08-08'));
    
    0 讨论(0)
提交回复
热议问题