Интервал представляет количество времени, прошедшее от 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"