两个日期范围之间的交集数量

3

我在我的Codeigniter应用程序中有两个日期范围,我想计算这两个范围之间相交的天数。你有什么好的想法吗?

Date1start = YYYY-MM-DD; Date1end = YYYY-MM-DD;

Date2start = YYYY-MM-DD; Date2end = YYYY-MM-DD;


1
“两个范围之间相交的天数” - 你能解释一下这是什么意思吗? - Amal Murali
1
你尝试过什么?能给我们展示一下你的代码吗?@AmalMurali 他想知道两个日期范围内有多少天是相同的。 - FrancoisBaveye
是的,我想找到重叠部分。 - Mumin Gazi
你应该提供一些示例和你尝试过的代码。 - Shaiful Islam
2个回答

6
像这样的东西应该可以工作。
$datetimeStart1 = new DateTime('2015-12-10');
$datetimeEnd1 = new DateTime('2015-12-20');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeEnd2 = new DateTime('2015-12-28');

// following https://dev59.com/ibeqzYgBFxS5KdRjEv-K
if ($datetimeStart1 < $datetimeEnd2 && $datetimeEnd1 > $datetimeStart2) {
    echo min($datetimeEnd1,$datetimeEnd2)->diff(max($datetimeStart2,$datetimeStart1))->days+1;
} else {
    echo 'no overlap';
}

演示: http://3v4l.org/9Pecb

仅适用于PHP 5.2

$datetimeStart1 = new DateTime('2015-12-10');
$datetimeStart1 = $datetimeStart1->format('U');
$datetimeEnd1 = new DateTime('2015-12-20');
$datetimeEnd1 = $datetimeEnd1->format('U');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeStart2 = $datetimeStart2->format('U');
$datetimeEnd2 = new DateTime('2015-12-28');
$datetimeEnd2 = $datetimeEnd2->format('U');

// following https://dev59.com/ibeqzYgBFxS5KdRjEv-K
if ($datetimeStart1 < $datetimeEnd2 && $datetimeEnd1 > $datetimeStart2) {
    echo round(
        ((min($datetimeEnd1,$datetimeEnd2)) - (max($datetimeStart2,$datetimeStart1))) / (60*60*24)) + 1;
} else {
    echo 'no overlap';
}

Demo: http://3v4l.org/a1WLk


谢谢您的回答,我尝试了您的代码,但是出现了“调用未定义的方法DateTime::diff()”错误。 - Mumin Gazi
你使用的 PHP 版本是多少?小于 5.2 吗? - Federkun
我已经更新了答案,提供了针对 PHP 5.2 的可能解决方法。但您应该彻底升级您的 PHP 版本。 - Federkun

4

简单易懂的编写:

$datetimeStart1 = new DateTime('2015-12-10');
$datetimeEnd1 = new DateTime('2015-12-20');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeEnd2 = new DateTime('2015-12-28');

$start = max($datetimeStart2,$datetimeStart1);
$end = min($datetimeEnd1,$datetimeEnd2);
echo $end >= $start ? $end->diff($start)->days+1 : "no overlap";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接