Показать объекты базы данных в течение определенного периода времени - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу отображать контент из базы данных с датами до 2 часов раньше.

Пример:

2018-11-09 20:00:00.000000
2018-11-08 19:00:00.000000
2018-11-06 19:00:00.000000
2018-11-06 18:00:00.000000

Допустим, время и дата 6 ноября в 18:00. Я хочу, чтобы отображались две нижние записи, а две будущие даты не показывались, пока текущее время не наступит в течение 2 часов с этого времени.

Мой код выглядит следующим образом:

$cT = strtotime($row3['MissionTime']) - strtotime("now");
                         if($cT <= strtotime('-2 hours')) {
                                 echo $row3['MissionTime']."<br>";
                            }

Я пробовал несколько разных способов, но я не могу заставить это работать правильно. Помощь и советы?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Причина, по которой ваш код не работает, заключается в том, что strtotime возвращает количество секунд с начала эпохи Unix. Когда вы вычтете два результата strtotime, вы получите разницу в количестве секунд, которая соответствует ожидаемой. Однако вы не можете сравнить это значение с strtotime('-2 hours'), так как выходное значение будет являться временной меткой на 2 часа раньше (сейчас это 1541539906), поэтому тест всегда будет проходить. Вы должны просто сравнить его с 7200 вместо этого (я уверен, основываясь на описании вашего вопроса, что +7200 более подходит, чем -7200). так что поменяй

if($cT <= strtotime('-2 hours')) {

до

if($cT <= 7200) {

Обратите внимание, что это почти наверняка лучше сделать в вашем запросе. Попробуйте добавить условие в ваш столбец времени как что-то вроде

WHERE MissionTime <= NOW() + INTERVAL 2 HOUR

И тогда вам вообще не нужно проверять PHP.

0 голосов
/ 07 ноября 2018

strtotime() возвращает отметку времени в секундах. Вычитание двух временных меток дает вам разницу между этими двумя временными метками в секундах.

Так что, если strtotime($row3['MissionTime']) - это отметка времени, которая в будущем будет через 1,5 часа, и вы вычтете из нее strtotime("now"), вы получите разницу 5400 секунд (60 секунд * 60 минут * 1,5 часа).

strtotime('-2 hours') дает вам метку времени для 2 часов назад, которая в настоящее время составляет около 1,5 миллиарда. Это не очень полезно для вашей ситуации.

Вот два способа изменить ваш код:

$cT = strtotime($row3['MissionTime']) - strtotime("now");
if($cT <= 7200) {
    echo $row3['MissionTime']."<br>";
}

Если разница между $row['MissionTime'] и now меньше 7200 секунд (60 секунд * 60 минут * два часа), $row3['MissionTime'] либо в прошлом, либо в течение следующих двух часов.

В качестве альтернативы:

if(strtotime($row3['MissionTime']) <= strtotime('+2 hours')) {
    echo $row3['MissionTime']."<br>";
}

В основном то же самое, но, возможно, более читабельно, если вы не планируете использовать $cT для чего-либо еще. Это просто проверяет, является ли $row3['MissionTime'] более ранним, чем когда-либо в +2 hours.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...