我的数据库包含日期,开始和结束变量。在我的代码中,当用户选择它们时,我抓住它们的开头和它们,并将它们转换为时间戳,就像这样(都在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
这会创建一个新日期,即一天之后。但我不认为这是正确的方法。如果有人能帮助我,我将非常感激。这让我有点挠头!非常感谢
答案 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小时的情况。这不适用于您当前的设置。