Периоды 20 дней между двумя датами, включая последнюю - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно перебрать дни между двумя датами с интервалом в 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 голосов
/ 28 февраля 2019

Вероятно, это проще сделать, просто увеличив значение $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

Демо на 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);
}

Демонстрация включена3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...