2013-01-07 171 views
1

如果我有兩個日期範圍(例如5月1日 - 5月31日和5月23日 - 6月5日),找出兩個期間在PHP中重疊多少天的最佳方式(因此它將返回9)?有沒有辦法做到這一點使用DatePeriod對象?如何在PHP中查找重疊的dateperiods /日期範圍?

編輯(希望)澄清我的問題:

基本上我想要的是,給定任意兩個日期範圍,將返回天數均爲日期範圍之間共同的數的函數。如果有重疊,它會返回重疊的天數,否則它將返回0.我認爲這可以通過爲每個範圍製作一個日期數組,循環遍歷它們以找到相同的日期,並使用變量進行計數比賽的數量 - 但我正在尋找更優雅的東西。

+1

有什麼**你**試過? – Neal

+0

對不起,我應該更清楚。我想我可以爲每個範圍做一個日期數組,循環遍歷它們以找到相同的日期,並使用一個變量來計算匹配的數量。看起來這可能過於複雜,但如果有更基本的方式來做到這一點與DatePeriod。我知道你可以使用DateTime-> diff來計算兩個日期之間的差異,所以我雖然可能有類似的DatePeriod,但我沒有太多的運氣在Google上。可能類似'$ dateperiod-> diff($ dateperiod2)'。 – Dustin

+0

好的,這個問題已經被降低並關閉了,這很好。但是我能做些什麼來阻止被低估? – Dustin

回答

18

感謝@ phpisuber01和Determine Whether Two Date Ranges Overlap提供這裏的基本邏輯。這四個變量需要是DateTime對象:

function datesOverlap($start_one,$end_one,$start_two,$end_two) { 

    if($start_one <= $end_two && $end_one >= $start_two) { //If the dates overlap 
     return min($end_one,$end_two)->diff(max($start_two,$start_one))->days + 1; //return how many days overlap 
    } 

    return 0; //Return 0 if there is no overlap 
} 
+4

要完成,也可以使用其他方式: { ... } – eddy147

2

沒有任何真實信息以此爲基礎。以下是如何使用DateTime對象計算天數差異的基本示例。

$datetime1 = new DateTime('2013-05-23'); 
$datetime2 = new DateTime('2013-05-31'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); //returns 8 days 

我假設你知道如何將你的字符串轉換成可用的時間戳/格式。

+0

是的,我已經知道如何比較兩個日期。我想要的是比較兩個日期範圍或DatePeriods的東西。即$ dateperiod1與$ dateperiod2重疊了多少? – Dustin

+0

@Dustin您需要做的就是獲取第一個範圍的最後日期和最後一個範圍的第一個日期並進行比較。繁榮。 – phpisuber01

+0

謝謝。這在我給出的例子中很有用,但我也應該提到,雖然其中一個範圍是預設的,另一個是由用戶設置的,所以可能根本沒有重疊。在這種情況下,將一個範圍內的最後一個日期與另一個範圍內的第一個日期進行比較,當它返回0時,會給出一個正數。 – Dustin