Я хочу быть независимым от часового пояса, настроенного на сервере, поэтому в сценарии я установил часовой пояс следующим образом:
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, но читать / записывать их в скриптах, которые имеют разные часовые пояса?