【问题标题】:Periods of 20 days between two dates including the last one两个日期之间的 20 天期间,包括最后一个日期
【发布时间】:2019-03-01 08:27:51
【问题描述】:

我需要以 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天)和提前一天。我该如何解决这些问题?

【问题讨论】:

    标签: php datetime dateinterval


    【解决方案1】:

    这可能更简单,只需将$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

    【讨论】:

    • 哦,谢谢!但最后的日期是不正确的。代码需要像这样的小修正:3v4l.org/PkkQ8。还有一个小问题要补充,你知道有什么方法可以轻松排除周末吗?
    • @Manuel23 我已经更新了我的答案以解决最终问题(使用min 函数可以稍微简化代码)。当您说排除周末时,您的意思是在间隔之外,所以向前推进 20 个非周末日?这有点棘手......
    • 是的,这会稍微减少一点。但如果它更复杂,我希望它更具可读性。我通过这个问题学到了新东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多