如何获得Carbon中两个时间间隔之间的差异

Moh*_*mal 5 php laravel

我有两次间隔时间,比方说

  • 区间X: [2019年11月1日 08:00, 2019年11月1日 14:00]
  • 区间Y:[2019年11月1日12:00、2019年11月1日17:00]

我需要获得这些间隔之间的交集,因此答案应该是 2 小时,因为间隔 Y 与间隔 X 仅在 2 小时内相交,那么如何在 Carbon 中做到这一点?有没有任何库或函数可以做到这一点?我已经搜索过但没有有用的结果。谢谢

请注意,我的意思是两个间隔之间的差异,而不仅仅是开始日期和结束日期

Vla*_*nko 7

时间间隔表示从时间 A 到时间 B 所经过的时间量,无论开始时间或结束时间如何。我猜你的意思是一个时期(日期范围)。

您可以使用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"
Run Code Online (Sandbox Code Playgroud)