Проверка временной метки перекрывается с PHP - PullRequest
0 голосов
/ 18 сентября 2009

Моя база данных содержит переменные даты, начала и конца. В моем коде я беру начало и их, когда пользователь их выбирает, и конвертирую их в метки времени, как это делается (все внутри цикла 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 утра), тогда эта отметка времени будет меньше, чем время начала, потому что код использует дату начала бронирования на. Это приводит к сбою логики и пропуску перекрытия.

Я думал о том, чтобы сделать:

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

    //...run same logic query

Который создает новую дату, которая является днем ​​позже. Но я не думаю, что это правильный путь. Если кто-нибудь может мне помочь, я был бы очень благодарен. Это заставило меня немного почесать голову! Большое спасибо

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Почему бы не использовать DATETIME для обоих столбцов, избегая каких-либо фокусов.

0 голосов
/ 18 сентября 2009

Я думаю, что вы почти поняли, но это может быть более хороший подход:

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 часа. Это не будет работать с вашей текущей настройкой.

...