2009-09-18 208 views
0

我的数据库保存日期,开始和结束变量。在我的代码我抢的开始和他们作为用户选择它们,并将它们转换为时间戳像这样(所有foreach循环内)..验证时间戳与PHP重叠

$selectionDate = strtotime($timeQry['date']); 
$startTimes[]  = strtotime($timeQry['start'],$selectionDate); 
$endTimes[]   = strtotime($timeQry['end'],$selectionDate);  

这给了我正确的开始和结束时间的时间戳。然后,我有一个逻辑语句来验证一下,看看是否有任何选定时间的重叠....

if(($startTimes[1] < $startTimes[0]) && ($endTimes[1] > $startTimes[0]) || 
($startTimes[1] > $startTimes[0]) && ($startTimes[1] < $endTimes[0])) 
{ 
    echo "overlap" 
} 

这如果要是以后结束时间的一个深夜12时正常工作的大部分时间,但是(比如说上午02:00),那么时间戳将小于开始时间,因为代码使用预订开始的日期。这会导致逻辑失败并错过重叠。

我曾经想过做:

if(($endTimes[$k] >= $selectionDate)) 
{ 
    $endTimes[]  = strtotime($timeQry['end'],$newDate+ 1253574000); 
} 
else 
{ 
    $endTimes[]  = strtotime($timeQry['end'],$selectionDate); 
} 

    //...run same logic query 

这将创建一个新的日期是一天之后。但我认为这不是正确的做法。如果有人能帮助我,我将非常感激。这让我挠了一下我的头!非常感谢

回答

1

为什么不对两列使用DATETIME,避免任何杂耍。

+0

我意识到设计应该会更好。我当时对这种类型的新东西很陌生。我可能会在将来改变它,但现在我需要首先对这个想法进行排序 – whamo 2009-09-18 16:37:42

0

我认为你几乎得到了它,但是这可能是一个更好的办法:

while(/* iterate */) { 
    //... 
    $selectionDate = strtotime($timeQry['date']); 
    $startTime = strtotime($timeQry['start'], $selectionDate); 
    $endTime = strtotime($timeQry['end'], $selectionDate); 
    if($endTime < $startTime) { 
     $endTime += 86400; 
    } 
    $startTimes[] = $startTime; 
    $endTimes[] = $endTime; 
}  

但作为cemkalyoncu提到你应该使用两个独立的时间戳,而不是三个“半”的人。我不知道您的申请,但是使用两个完整的时间戳还将涵盖时差超过24小时的情况。这不适用于您当前的设置。

+0

干杯。因此,如果结束时间小于开始时间,则需要24小时。当你说我应该为每列使用日期时间时,这是否意味着ocode会在午夜之后解释变化?所以我不需要添加24小时? – whamo 2009-09-18 17:35:23

+0

如果使用'datetime',一个包含UNIX时间戳或任何其他(伪)唯一时间戳的整数,则不必添加24小时,因为每个时间戳都包含完整的日期和时间,因此不需要进一步区分。 – Koraktor 2009-09-24 05:06:33