有沒有一種計算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個或更多日期在PHP中是否重疊的有效方法?計算2個或更多日期是否重疊
Ex。
在上述日期1和日期2的例子中重疊,DATE3是OK。
如果你的日期是在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 }
如果你有一堆的日期(我理解這個問題),你可以使用一個interval tree和日期轉換爲整數(該unix time可以使用)
感謝@ Germann-Arlington - if($ date1 ['start'] <= $ date2 ['end'] && $ date2 ['start'] <= $ date1 ['end']){// overlap} – Waygood 2012-08-15 10:45:06
這看起來不錯,但超過2個日期呢?如果可能的話,我想避免嵌套循環... – feketegy 2012-08-15 10:53:06
這取決於您的要求,但是比較兩個日期的單個函數是一個起點。如果您有3個日期,則比較1和2會給出重疊(標記兩者)。然後你需要比較3和1(不重疊),所以檢查2(不重疊)。您確實需要在組合中循環,但如果存在重疊,則結束當前循環。 – Waygood 2012-08-15 11:08:50