Необходимо использовать преобразование метки времени UTC в PHP / MySQL для каждого соединения - PullRequest
3 голосов
/ 17 июня 2011

Я хочу быть независимым от часового пояса, настроенного на сервере, поэтому в сценарии я установил часовой пояс следующим образом:

mysql_query("SET time_zone = '".date_default_timezone_get()."';");

Сервер в настоящее время настроен на Европу / Москву, который в настоящее время имеет UTC + 4

Затем на сайте PHP я выбираю что-то из базы данных, например:

date_default_timezone_set('Europe/Berlin');
$sth = $dbh->prepare("SET time_zone = '".date_default_timezone_get()."';");
$sth->execute();
$sth = $dbh->prepare("SELECT  * from logs WHERE time like '2011-06-1%'");
$sth->execute();

Я использую тип поля Timestamp, а не Datetime.

Не то, что я получаю, - это отметка времени, которая в будущем будет на 2 часа больше.

Документ MySQL говорит:

Значения для столбцов TIMESTAMP: конвертируется из текущего часового пояса в UTC для хранения и из UTC в текущий часовой пояс для поиска.

Итак, это подводит меня к 3 возможным случаям:

  • Преобразование хранилища работает, выберите нет: Нет - потому что тогда отметка времени будет на 2 (или 1 зимой) часа слишком далекой в ​​прошлом

  • Преобразование хранилища не работает, но выберите делает: Нет - потому что тогда я бы увидел UTC, который равен -1 часам, а это не так

  • Преобразование хранилища не работает, выбранное преобразование не работает: выглядит точно так же!

Теперь временная метка, которую я записываю в базу данных, построена и написана на стороне PHP:

$hourprec = "Y-m-d H:00:00";
$hour = date($hourprec); // mysql compatible
...
REPLACE INTO logs (time,...) VALUES('".$hour."','"....

Я могу себе представить, что это создает проблемы с преобразованием времени в mysqls, потому что оно приходит в виде строки, и я должен выполнить FROM_UNIXTIME или что-то в этом роде.

Но разве это не должно работать, по крайней мере, с выбором тогда?

Я что-то упустил? Как мне это сделать, если я хочу правильно хранить и читать метки времени в UTC в базе данных mysql, но читать / записывать их в скриптах, которые имеют разные часовые пояса?

1 Ответ

4 голосов
/ 17 июня 2011

Ответ был довольно тривиальным.

Подход, описанный выше, просто отлично, MySql просто не знает ЛЮБЫХ часовых поясов.

Вы можете проверить это с помощью команды SET time_zone = 'UTC';

Если у вас та же проблема, что и у спрашивающего, вы должны получить следующую ошибку:

#1298 - Unknown or incorrect time zone: 'UTC'

Это можно легко исправить с помощью следующей команды:

mysql_tzinfo_to_sql /usr/share/zoneinfo/|mysql -u root mysql -p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...