2012-01-03 180 views
6

我一直在尋找這個,但答案似乎沒有。這裏的問題: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

回答

5

那麼,從邏輯上講,您可以將範圍的要求分解爲另一部分。

範圍是只部分地在另一範圍內,如果:

  • 範圍1的開始日期>比範圍2的開始日期,但不>比範圍2的結束日期
  • 範圍1的結束日期是<比範圍2的結束日期,但不<比range2的開始日期

如果其中任何一個或兩個都是真的,則範圍在彼此之內。

7

下面是使用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!'; 
} 
0

雖然這是一個很老的帖子。但如果有人卡住了。這裏是重疊日期的完整示例。

<?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!'; 
} 
?> 
相關問題