获取两个日期之间的日期范围,不包括周末

时间:2021-11-21 08:36:14

Given the following dates:

鉴于以下日期:

6/30/2010 - 7/6/2010

and a static variable:

和一个静态变量:

$h = 7.5

I need to create an array like:

我需要创建一个数组,如:

Array ( [2010-06-30] => 7.5 [2010-07-01] => 7.5 => [2010-07-02] => 7.5 => [2010-07-05] => 7.5 => [2010-07-06] => 7.5) 

Weekend days excluded.

周末除外。

No, it's not homework...for some reason I just can't think straight today.

不,这不是作业......出于某种原因,我今天无法直接思考。

4 个解决方案

#1


23  

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

对于PHP> = 5.3.0,请使用DatePeriod类。遗憾的是,它几乎没有记录。

$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);

#2


3  

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.

更新:忘了跳过周末。这应该现在有效。

#3


1  

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

这是gnud的答案,但是作为一个函数(还添加了一个从计算中排除当前日期的选项):

(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);

#4


0  

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

这是OOP方法,以防万一。它返回一个包含所有日期的数组,周末除外。

    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'));

#1


23  

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

对于PHP> = 5.3.0,请使用DatePeriod类。遗憾的是,它几乎没有记录。

$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);

#2


3  

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.

更新:忘了跳过周末。这应该现在有效。

#3


1  

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

这是gnud的答案,但是作为一个函数(还添加了一个从计算中排除当前日期的选项):

(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);

#4


0  

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

这是OOP方法,以防万一。它返回一个包含所有日期的数组,周末除外。

    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'));