PHP,看日期范围是否部分在另一个日期范围内

问题描述:

我一直在寻找这个,但答案似乎没有。这里的问题:PHP,看日期范围是否部分在另一个日期范围内

说,我有两个日期范围。

$daterange1 = 2012-04-20 till 2012-04-28 
$daterange2 = 2012-04-18 till 2012-05-01 

现在,我想知道daterange2是否在daterange1内。但是,正如您所看到的,daterange2仅部分在daterange1内。有没有让3个变量回来,像任何方式:

  1. 2012-04-18至2012-04-20
  2. 2012-04-20至2012-04-28
  3. 2012-04 -28至2012-05-01

我知道这听起来有点含糊,但我真的不知道如何解释它的不同。

+3

我明白这个问题,你可能想用'strtotime()'函数转换所有的时间,并开始比较。也许'DateTime'对象也会在这里帮助你。 – 2012-01-03 19:59:31

+0

你需要知道范围是否在第三个变量内 – 2012-01-03 20:10:21

那么,从逻辑上讲,您可以将范围的要求分解为另一部分。

范围是只部分地在另一范围内,如果:

  • 范围1的开始日期>比范围2的开始日期,但不>比范围2的结束日期
  • 范围1的结束日期是<比范围2的结束日期,但不<比range2的开始日期

如果其中任何一个或两个都是真的,则范围在彼此之内。

下面是使用PHP的DateTime类的示例。请注意,如果您将无效的日期字符串传递给DateTime::__construct(),该函数将抛出异常,因此如果您担心这一点,应该实施try/catch块。另外,我使用PHP的minmax函数,以便指定日期的顺序无关紧要。

$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!'; 
} 
?>