работа с метками времени и часовыми поясами - PullRequest
0 голосов
/ 27 февраля 2012

Из моего приложения для смартфона Android (сделанного мной) я отправляю запрос на сервер в Денвере, чтобы сохранить свое местоположение и время. TIMESTAMP - это текущее время Денвера (разница в 9 часов от местного времени). Теперь через 16 часов после последнего запроса я написал в своем php скрипте

$query = "SELECT * FROM `tblLoc` WHERE datetime > (CURRENT_TIMESTAMP - 86400)";

так, как будто я хотел показать мне последние 24 часа ....

ЭТА БЫЛА ОШИБКА!

$query = "SELECT * FROM `tblLoc` WHERE datetime > CURRENT_TIMESTAMP() - INTERVAL 24 HOUR";

в SQL 86400! = 24 ЧАСА !!!

1 Ответ

1 голос
/ 27 февраля 2012

Вам нужно либо изменить часовой пояс MySQL вместо PHP, либо изменить свой запрос так, чтобы PHP предоставлял временную метку, например:

$query = "SELECT * FROM tblLoc WHERE dateTime > (". time() ." - 86400)";

РЕДАКТИРОВАТЬ на основе комментария

UTC_TIMESTAMP() может быть хорошим способом, но убедитесь, что вы вставляете / обновляете также на основе этой же временной метки, а не на CURRENT_TIMESTAMP().

Метка времени UTC основана на GMT (время по Гринвичу) и находится в GMT + 0.Даллас в GMT-6, а Азия / Иерусалим в GMT + 2.Таким образом, UTC_TIMESTAMP() всегда означает текущее время в часовом поясе GMT, независимо от того, какой у вас текущий часовой пояс.CURRENT_TIMESTAMP() означает текущее время в вашем текущем часовом поясе.

ОДНАКО ваши результаты могут быть не совсем правильными.Они могут просто выглядеть правильно на данный момент, но могут быть выключены на пару часов.Но если вы вставляете и обновляете на основе CURRENT_TIMESTAMP, а затем выбираете на основе UTC_TIMESTAMP, ваши результаты не будут правильными.

Я бы предложил одно из следующих трех решений:

  1. Переключите часовой пояс вашего сервера на Азию / Иерусалим (не забудьте перезапустить MySQL, чтобы применить изменения).
  2. Установите часовой пояс в начале каждого сценария, используя 'SET time_zone = timezone;'.
  3. Создайте переменную среды TZ с правильным часовым поясом, чтобы MySQL устанавливал этот часовой пояс в качестве значения по умолчанию при запуске (снова, обязательно перезапустите MySQL).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...