Как получить разницу между двумя интервалами времени в Carbon - PullRequest
2 голосов
/ 07 ноября 2019

У меня есть два интервала времени, скажем,

  • Интервал X: [01-11-2019 08:00, 01-11-2019 14:00]
  • ИнтервалY: [01-11-2019 12:00, 01-11-2019 17:00]

Мне нужно получить пересечение между этими интервалами, поэтому ответ должен быть 2 часа, потому что интервал Yпересечение с интервалом X только через 2 часа, так как это сделать в углероде? Есть ли библиотека или функция для этого? Я искал, но без полезных результатов. Спасибо

Обратите внимание, я имею в виду разницу между двумя интервалами , а не только startDate и endDate

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Интервал представляет количество времени, прошедшее от timeA до timeB, независимо от времени начала или времени окончания. Я предполагаю, что вы имеете в виду период (диапазон дат).

Вы можете рассчитать перекрытие (пересечение) между двумя диапазонами дат, используя CarbonPeriod класс и простую функцию.

Я хотел бы предложить следующую реализацию:

<?php
use Carbon\CarbonInterval;
use Carbon\CarbonPeriod;

function calculatePeriodsOverlap(CarbonPeriod $periodA, CarbonPeriod $periodB): CarbonInterval
{
    if (!$periodA->overlaps($periodB)) {
        return new CarbonInterval(0);
    }

    $firstEndDate = min($periodA->calculateEnd(), $periodB->calculateEnd());
    $latestStartDate = max($periodA->getStartDate(), $periodB->getStartDate());

    return CarbonInterval::make($firstEndDate->diff($latestStartDate));
}


$periodX = new CarbonPeriod('01-11-2019 08:00', '01-11-2019 14:00');
$periodY = new CarbonPeriod('01-11-2019 12:00', '01-11-2019 17:00');

calculatePeriodsOverlap($periodX, $periodY)->forHumans(); // returns "2 hours"
0 голосов
/ 07 ноября 2019

Вам не нужна библиотека, как углерод. Используйте просто DateTime.

$iX0 = date_create('01-11-2019 08:00');  //Start interval X
$iX1 = date_create('01-11-2019 14:00');  //End interval X
$iY0 = date_create('01-11-2019 12:00');  //Start interval Y
$iY1 = date_create('01-11-2019 17:00');  //End interval Y

$i0 = MAX($iX0,$iY0);
$i1 = Min($iX1,$iY1);
if($i1 >= $i0){
  $diff = $i0->diff($i1);
  echo $diff->h." Hours";  //full Hours
}
else {
  echo 'no itersect';
}

Вывод:

2 Hours

Примечание. В этом примере вычисляются только полные часы без минут и секунд.

Попробуйте сами: https://3v4l.org/uS1Fh

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