Как рассчитать уникальное количество дней между двумя или более диапазонами дат - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно рассчитать количество уникальных дней в двух или более диапазонах дат (даты начала и окончания).Проблема возникает, когда даты начинают перекрываться (см. Пример ниже).

Диапазон дат № 1 (7 дней):

  • Начало: 2019-06-01
  • Конец: 2019-06-07

Диапазон дат № 2 (5 дней):

  • Начало: 2019-06-05
  • Конец: 2019-06-10

Диапазон дат № 3 (10 дней):

  • Начало: 2019-06-20
  • Окончание: 2019-06-30

Всего дней: 23 дня

Всего уникально дней: 20 дней

Естьбольшое количество данных для обработки и даты могут охватывать длительные периоды, поэтому мне нужен эффективный и быстрый способ выполнить расчет.Проект построен в Laravel 5.

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Используя Carbon, вы можете, для каждого диапазона, добавить все дни между началом и концом и, для каждой вставки, проверить, что текущей даты еще нет в массиве.

Вы получите массив всех уникальных дней, и вы сможете count it.

0 голосов
/ 04 июня 2019

Обратите внимание, что в первом примере разница составляет 6 дней, а не 7 дней.

код

<?php

$dateRanges = 
[
    [
        'start' => "2019-06-01",
        'end' => "2019-06-07",
    ],
    [
        'start' => "2019-06-05",
        'end' => "2019-06-10",
    ],
    [
        'start' => "2019-06-20",
        'end' => "2019-06-30",
    ]
];

$uniqueDayDiffCount = 0;
foreach($dateRanges as $dateRange) {
    $start = new DateTime($dateRange['start']);
    $end = new DateTime($dateRange['end']);

    $first = $start;

    /**
     * Check if a new $start date overlaps
     * with the prvious end date ($last) and if so
     * take for calcualtion as start
     * date ($first) the previous
     * end date ($last)
     */
    if (isset($last) && $last > $start) {
        $first = $last;
    }

    $last = $end;

    echo "\n<br>Start: " . $start->format("Y-m-d");
    echo "\n<br>End: " . $end->format("Y-m-d");

    echo "\n<br>Calc for Start: " . $first->format("Y-m-d");
    echo "\n<br>Calc for End: " . $last->format("Y-m-d");

    $diff = $last->diff($first)->format("%a");
    $uniqueDayDiffCount += $diff;

    echo "\n<br>Diff: $diff\n<br>DayCount: $uniqueDayDiffCount";
    echo "\n<br>---------------------\n<br>";

}

echo "\n<br>Total DayCount: $uniqueDayDiffCount";

Результат

Start: 2019-06-01
End: 2019-06-07
Calc for Start: 2019-06-01
Calc for End: 2019-06-07
Diff: 6
DayCount: 6
---------------------

Start: 2019-06-05
End: 2019-06-10
Calc for Start: 2019-06-07
Calc for End: 2019-06-10
Diff: 3
DayCount: 9
---------------------

Start: 2019-06-20
End: 2019-06-30
Calc for Start: 2019-06-20
Calc for End: 2019-06-30
Diff: 10
DayCount: 19
---------------------

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