查找两个PHP日期周期中的重叠分钟数

查找两个PHP日期周期中的重叠分钟数,php,datetime,overlap,Php,Datetime,Overlap,我想找出给定两分钟的重叠时间 比如说, 我有$startDate1和$endDate1作为第一个日期范围。 我有$startDate2和$endDate2作为第二个日期范围。 为便于演示,格式为“Y-m-dh:i” 假设$startDate1='2015-09-11 09:15'和$endDate1='2015-09-13 11:30' 假设$startDate2='2015-09-13 10:45'和$endDate2='2015-09-14 12:00' 我预计结果是45分钟的重叠。如何做到

我想找出给定两分钟的重叠时间

比如说,

我有$startDate1和$endDate1作为第一个日期范围。 我有$startDate2和$endDate2作为第二个日期范围。 为便于演示,格式为“Y-m-dh:i”

假设$startDate1='2015-09-11 09:15'和$endDate1='2015-09-13 11:30'

假设$startDate2='2015-09-13 10:45'和$endDate2='2015-09-14 12:00'

我预计结果是45分钟的重叠。如何做到这一点

这个问题被标记为重复,但它们不相同。我在寻找两个日期周期内重叠的时间量,而不是两个日期之间的差异。DatePeriod由两个日期组成,我在寻找两个DatePeriod之间的重叠量,而不是差异

这里是DatePeriodsOverlap类,它表示两个期间的重叠。 它的结果是重叠的DatePeriod或异常(如果没有交集)

注意:DatePeriod是可遍历对象,PT1M是迭代步骤的持续时间。PT1M表示一分钟间隔。详细信息对象

使用示例和问题答案,如何在分钟内实现重叠:

<?php
$d1 = new DatePeriod(
    new DateTime('2015-09-11 09:15:00'),
    new DateInterval('PT1M'),
    new DateTime('2015-09-13 11:30:00')
);


$d2 = new DatePeriod(
    new DateTime('2015-09-13 10:45:00'), 
    new DateInterval('PT1M'),
    new DateTime('2015-09-14 12:00:00')
);

$overlapPeriod = (new DatePeriodsOverlap(
    $d1, 
    $d2, 
    new DateInterval('PT1M')) // PT1M - 1 minute interval, 
                              // P1D - 1 day interval
)->overlap();


$minutes = iterator_count($overlapPeriod); // 45 minutes

// interval in minutes without iterating
$overlapPeriod->getEndDate()
    ->diff($overlapPeriod->getStartDate())
    ->i; // is interval in minutes (H:i:s)


/**
 * Overlap of two periods
 */
class DatePeriodsOverlap {
  private $d1;
  private $d2;
  private $di; // DateInterval, default is 1 day

  /**
   * @param DatePeriod $d1 first period
   * @param DatePeriod $d2 second period
   * @param DateInterval $di interval measurement
   */
  public function __construct(
    DatePeriod $d1, 
    DatePeriod $d2, 
    DateInterval $di = null) 
  {
    $this->d1 = $d1;
    $this->d2 = $d2;
    $this->di = $di ?? new DateInterval('P1D');
  }

  /**
   * Returns new overlapping period
   *
   * @throws Exception if not overlapped
   * @return DatePeriod 
   */
  public function overlap() : DatePeriod 
  {
    $startOne = $this->d1->getStartDate();
    $endOne = $this->d1->getEndDate();

    $startTwo = $this->d2->getStartDate();
    $endTwo = $this->d2->getEndDate();

    //If the dates overlap
    if ($startOne < $endTwo && $endOne > $startTwo) 
    {
      return new DatePeriod(
        max($startTwo,$startOne), 
        $this->di,
        min($endOne,$endTwo)
      );
    }

    throw new Exception(
      "No overlap " .
      "[{$this->d1->getStartDate()->format('Y-m-d H:i:s')}-{$this->d1->getEndDate()->format('Y-m-d H:i:s')}] and " .
      "[{$this->d2->getStartDate()->format('Y-m-d H:i:s')}-{$this->d2->getEndDate()->format('Y-m-d H:i:s')}]"
    );
  }
}

这一点已经得到了回答:这并没有回答我的问题。你给我的例子不是用两个日期段,而是用两个日期。一个日期周期由两个日期组成。而且,我不想看有什么不同,我在寻找重叠时间的数量。@LukeJames您当然可以使用链接主题中的答案,使用一些逻辑来制定您自己的解决方案,例如,如果EndDate 1>StartDate 2,则获得它们的差异。您还应该为您的建议提供一个简短的解释solution@yakobom谢谢大家的评论,我已经用细节更新了答案。