【问题标题】:How to get difference between two intervals of time in Carbon如何在Carbon中获得两个时间间隔之间的差异
【发布时间】:2020-03-04 02:44:01
【问题描述】:

假设我有两个时间间隔

  • 区间 X:[01-11-2019 08:00, 01-11-2019 14:00]
  • 间隔 Y:[01-11-2019 12:00, 01-11-2019 17:00]

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

请注意,我指的是两个间隔之间的差异,而不仅仅是 startDate 和 endDate

【问题讨论】:

标签: php laravel


【解决方案1】:

间隔表示从时间 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"

【讨论】:

    【解决方案2】:

    你不需要图书馆怎么碳。只需使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多