包括最后一个日期在内的两个日期之间的20天时间

时间:2019-02-27 21:58:44

标签: php datetime dateinterval

我需要遍历两个日期之间的日期,间隔为20天,包括最后一个日期。例如,在日期2019/01/01和2019/01/27之间应返回以下范围:

2019-01-01  =>  2019-01-20
2019-01-21  =>  2019-02-09
2019-02-10  =>  2019-02-27

我尝试使用以下代码:

$start = new DateTime('2019-01-01');
$end = new DateTime('2019-02-27');
$interval = new DateInterval('P20D');
$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);

$from = $start->format('Y-m-d');
foreach ($period as $day) {
    $to = $day->format('Y-m-d');

    echo $from . '  =>  ' . $to . '<br>';

    $from = $day->modify('+1 day')->format('Y-m-d');
}

输出:

2019-01-01  =>  2019-01-21
2019-01-22  =>  2019-02-10

此代码有两个问题,不包括最后一个期间(不再包含20天),并且提前一天。我该如何解决这些问题?

1 个答案:

答案 0 :(得分:2)

这可能更简单,只需将$start的值增加$interval,直到它大于$end的值。请注意,间隔必须为19天,才能有20天(包括开始和结束)的时间。

$start = new DateTime('2019-01-01');
$end = new DateTime('2019-02-27');
$interval = new DateInterval('P19D');
while ($start < $end) {
    echo $start->format('Y-m-d') . ' => ';
    $start->add($interval);
    echo min($start, $end)->format('Y-m-d') . "\n";
    $start->add(new DateInterval('P1D'));
}

输出:

2019-01-01 => 2019-01-20 
2019-01-21 => 2019-02-09
2019-02-10 => 2019-02-27

Demo on 3v4l.org

更新

这是该代码的一个版本,也将在周末跳过:

$start = new DateTime('2019-01-01');
$end = new DateTime('2019-02-27');
$interval = new DateInterval('P1D');
$days = 19;
while ($start < $end) {
    echo $start->format('Y-m-d') . ' => ';
    for ($i = 0; $i < $days; ) {
        $start->add($interval);
        $day_of_week = $start->format('N');
        if ($day_of_week == 6 || $day_of_week == 7) continue;
        $i++;
    }
    echo min($start, $end)->format('Y-m-d') . "\n";
    $start->add($interval);
}

Demo on 3v4l.org