验证时间戳与PHP重叠

时间:2009-09-18 15:54:28

标签: php timestamp logic

我的数据库包含日期,开始和结束变量。在我的代码中,当用户选择它们时,我抓住它们的开头和它们,并将它们转换为时间戳,就像这样(都在foreach循环中)..

$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 am),则该时间戳将小于开始时间,因为代码使用了预订开始的日期上。这会导致逻辑失败并且错过重叠。

我考虑过这样做:

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

    //...run same logic query

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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小时的情况。这不适用于您当前的设置。