找出PHP中两个日期范围重叠的天数

问题描述 投票:-1回答:2

我有两个任意日期范围,例如:

2019-01-01 - 2019-01-10
and
2019-01-06 - 2019-01-20

我如何在PHP中找到这些日期范围重叠的天数? (在上面的例子中是5天)

php php-7
2个回答
1
投票

这是使用DateTimeDateInterval对象的解决方案:

$range1 = '2019-01-01 - 2019-01-10';
$range2 = '2019-01-06 - 2019-01-20';
list($start, $end) = explode(' - ', $range1);
$start1 = new DateTime($start);
$end1 = new DateTime($end);
list($start, $end) = explode(' - ', $range2);
$start2 = new DateTime($start);
$end2 = new DateTime($end);
if ($end1 > $start1) {
    $overlap = $end1->diff(min($start2, $end2));
}
else {
    $overlap = $start1->diff(min($start2, $end2));
}
echo "overlap is " . ($overlap->format('%a') + 1) . " days";

产量

overlap is 5 days

Demo on 3v4l.org

更新

这是一个更强大的代码版本,允许范围的任意重叠(包括一个完全包含在另一个中):

function range_overlap($range1, $range2) {
    list($start, $end) = explode(' - ', $range1);
    $start = new DateTime($start);
    $end =  new DateTime($end);
    $start1 = min($start, $end);
    $end1 = max($start, $end);
    list($start, $end) = explode(' - ', $range2);
    $start = new DateTime($start);
    $end =  new DateTime($end);
    $start2 = min($start, $end);
    $end2 = max($start, $end);
    // check for special cases
    if ($start1 >= $start2 && $end1 <= $end2) {
        // range1 completely contained inside range2
        $overlap = $start1->diff($end1);
    }
    elseif ($start2 >= $start1 && $end2 <= $end1) {
        // range2 completely contained inside range1
        $overlap = $start2->diff($end2);
    }
    elseif ($end2 > $end1) {
        // range1 ends first
        $overlap = $start2->diff($end1);
    }
    else {
        // range2 ends first
        $overlap = $start1->diff($end2);
    }
    // if overlap is < 0 then there is no overlap
    $overlap_days = $overlap->invert ? 0 : ($overlap->format('%a') + 1);
    echo "overlap is $overlap_days days\n";
}

它可以像这样调用:

range_overlap('2019-01-01 - 2019-01-10', '2019-01-06 - 2019-01-20'); // 5 days
range_overlap('2019-01-01 - 2019-03-20', '2019-05-06 - 2019-04-20'); // no overlap
range_overlap('2019-01-10 - 2019-05-20', '2019-01-01 - 2019-05-20'); // 131 days
range_overlap('2019-01-06 - 2019-01-20', '2019-01-10 - 2019-01-01'); // 5 days
range_overlap('2019-01-30 - 2019-01-10', '2019-01-12 - 2019-01-15'); // 4 days
range_overlap('2019-02-01 - 2019-03-20', '2019-01-10 - 2019-02-28'); // 28 days

Demo on 3v4l.org


1
投票

我不太确定,你想做什么,但检查这个解决方案:

<?php

$date1 = strtotime('2019-01-01');
$date2 = strtotime('2019-01-10');

$date3 = strtotime('2019-01-06');
$date4 = strtotime('2019-01-20');

$dateDiff1 = $date2 - $date1;
$dateDiff2 = $date4 - $date3;

$finalDiff = $dateDiff2 - $dateDiff1;

echo round($finalDiff / (60 * 60 * 24));

返回:

5

有关更多信息strtotime()

注意:仅当第二个日期总是大于第一个日期时,它才会起作用。你的问题不明确。

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