2012-08-15 54 views
1

有沒有一種計算2個或更多日期在PHP中是否重疊的有效方法?計算2個或更多日期是否重疊

Ex。

  • 日期1: START1 = 2012-03-10/END1 = 2012-05-10
  • 日期2: START2 = 2012-04-25/END2 = 2012-06-01
  • DATE3: START3 = 2012-07-15/END3 = 2012-08-20

在上述日期1和日期2的例子中重疊,DATE3是OK。

回答

2

如果你的日期是在YYYY-MM-DD格式,那麼你可以做一個字符串比較(他們沒有被有效日期要麼或者如果使用的UNIX時間戳的strtotime()1970年以後)

if(($date1['start']>=$date2['start'] && $date1['start']<=$date2['end']) || ($date1['end']>=$date2['start'] && $date1['end']<=$date2['end']) || ($date1['start']<=$date2['start'] && $date1['end']>=$date2['end'])) 
{ 
    // overlap 
} 

此檢查開始或日期1月底之間是date2的開始和結束,或者如果date1圍繞date2

感謝@ GERMANN阿靈頓 -

if($date1['start']<=$date2['end'] && $date2['start']<=$date1['end']) { // overlap } 
+0

感謝@ Germann-Arlington - if($ date1 ['start'] <= $ date2 ['end'] && $ date2 ['start'] <= $ date1 ['end']){// overlap} – Waygood 2012-08-15 10:45:06

+0

這看起來不錯,但超過2個日期呢?如果可能的話,我想避免嵌套循環... – feketegy 2012-08-15 10:53:06

+0

這取決於您的要求,但是比較兩個日期的單個函數是一個起點。如果您有3個日期,則比較1和2會給出重疊(標記兩者)。然後你需要比較3和1(不重疊),所以檢查2(不重疊)。您確實需要在組合中循環,但如果存在重疊,則結束當前循環。 – Waygood 2012-08-15 11:08:50

1

如果你有一堆的日期(我理解這個問題),你可以使用一個interval tree和日期轉換爲整數(該unix time可以使用)

+0

如果日期是時代(1970-01-01)後,您只能轉換爲UNIX時間,它不是必要的,因爲日期是在MySQL的風格所以才作爲字符串進行比較 – Waygood 2012-08-15 11:11:08

+0

@Waygood如果我們正在處理大型數據庫,則預計轉換爲整數將更有效(無論是在時間還是空間中)。但是,也可以使用字符串的詞法比較。如果存在多個間隔,則此答案中的主要問題是間隔樹的使用情況。 – amit 2012-08-15 11:15:03