确定两个日期时间范围何时重叠

问题描述 投票:0回答:1

我有两个日期时间间隔,我想确定它们之间的重叠时间段。例如,如果我有间隔:

  • 2023 年 12 月 1 日 01:00:00 至 2023 年 12 月 12 日 15:00:00
  • 2023年12月10日 11:00:00 至 2023年12月24日 16:00:00

我需要检索公共区间,在本例中为

10-12-2023 11:00:00
12-12-2023 15:00:00
。我如何在 PHP 中实现这一点,无论是使用本机函数还是像 Carbon 这样的库?

这是我的代码:

<?php
require 'vendor/autoload.php';
use Carbon\Carbon;

$range1Start = Carbon::parse('2023-12-01 01:00:00');
$range1End = Carbon::parse('2023-12-12 15:00:00');

$range2Start = Carbon::parse('2023-12-10 11:00:00');
$range2End = Carbon::parse('2023-12-24 16:00:00');

if ($range1Start->lessThan($range2End) && $range2Start->lessThan($range1End)) {
    // Calculate the overlapping period
    $overlapStart = $range1Start->max($range2Start);
    $overlapEnd = $range1End->min($range2End);

    echo "Overlap: {$overlapStart->toDateTimeString()} to {$overlapEnd->toDateTimeString()}\n";
} else {
    echo "No overlap.\n";
}
php datetime php-carbon
1个回答
0
投票

您可以遵循一个简单的算法:

  1. 确定最晚开始和最早结束。
  2. 如果最晚开始时间大于最早结束时间:不存在重叠。
  3. 否则,最晚开始和最早结束之间会发生重叠。

这是一个实现示例:

<?php
require 'vendor/autoload.php';
use Carbon\Carbon;

$range1Start = Carbon::parse('2023-12-01 01:00:00');
$range1End = Carbon::parse('2023-12-12 15:00:00');

$range2Start = Carbon::parse('2023-12-10 11:00:00');
$range2End = Carbon::parse('2023-12-24 16:00:00');


$maxStart = $range1Start->max($range2Start);
$minEnd = $range1End->min($range2End);

if ($maxStart->lessThan($minEnd)) {
    echo "Overlap: {$maxStart->toDateTimeString()} to {$minEnd->toDateTimeString()}\n";
} else {
    echo "No overlap.\n";
}

© www.soinside.com 2019 - 2024. All rights reserved.