PHP,看日期范围是否部分在另一个日期范围内
问题描述:
我一直在寻找这个,但答案似乎没有。这里的问题:PHP,看日期范围是否部分在另一个日期范围内
说,我有两个日期范围。
$daterange1 = 2012-04-20 till 2012-04-28
$daterange2 = 2012-04-18 till 2012-05-01
现在,我想知道daterange2是否在daterange1内。但是,正如您所看到的,daterange2仅部分在daterange1内。有没有让3个变量回来,像任何方式:
- 2012-04-18至2012-04-20
- 2012-04-20至2012-04-28
- 2012-04 -28至2012-05-01
我知道这听起来有点含糊,但我真的不知道如何解释它的不同。
答
那么,从逻辑上讲,您可以将范围的要求分解为另一部分。
范围是只部分地在另一范围内,如果:
- 范围1的开始日期>比范围2的开始日期,但不>比范围2的结束日期
- 范围1的结束日期是<比范围2的结束日期,但不<比range2的开始日期
如果其中任何一个或两个都是真的,则范围在彼此之内。
答
下面是使用PHP的DateTime
类的示例。请注意,如果您将无效的日期字符串传递给DateTime::__construct()
,该函数将抛出异常,因此如果您担心这一点,应该实施try/catch块。另外,我使用PHP的min
和max
函数,以便指定日期的顺序无关紧要。
$daterange1 = array('2012-04-20', '2012-04-28');
$daterange2 = array('2012-04-18', '2012-05-01');
$range_min = new DateTime(min($daterange1));
$range_max = new DateTime(max($daterange1));
$start = new DateTime(min($daterange2));
$end = new DateTime(max($daterange2));
if ($start >= $range_min && $end <= $range_max) {
echo 'woot!';
} else {
echo 'doh!';
}
答
虽然这是一个很老的帖子。但如果有人卡住了。这里是重叠日期的完整示例。
<?php
$daterange1 = array('2017-09-24', '2017-09-28');
$daterange2 = array('2017-09-22', '2017-09-25');
$range_min = new DateTime(min($daterange1));
$range_max = new DateTime(max($daterange1));
$start = new DateTime(min($daterange2));
$end = new DateTime(max($daterange2));
if ($start >= $range_min && $end <= $range_max) {
echo 'Overlapping!';
}
else if($end > $range_min && $start < $range_max){
echo "partialy";
}
else {
echo 'free!';
}
?>
我明白这个问题,你可能想用'strtotime()'函数转换所有的时间,并开始比较。也许'DateTime'对象也会在这里帮助你。 – 2012-01-03 19:59:31
你需要知道范围是否在第三个变量内 – 2012-01-03 20:10:21