Из руководства ( раздел 9.6 ):
Текущие значения глобальных и клиентских часовых поясов могут быть получены следующим образом:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Редактировать Вышеприведенное возвращается, SYSTEM
если MySQL установлен как подчиненный для часового пояса системы, что менее чем полезно. Поскольку вы используете PHP, если ответ от MySQL SYSTEM
, вы можете спросить систему, через какой часовой пояс он использует date_default_timezone_get
. (Конечно, как VolkerK отметил, PHP может быть запущен на другом сервере, но предположения идут, предполагая , веб - сервер и сервер БД он разговаривает будут установлены в [если на самом деле не в ] тот же часовой пояс не является огромный скачок.) Но учтите, что (как и в MySQL), вы можете установить часовой пояс, который использует PHP (date_default_timezone_set
), что означает, что он может сообщать значение, отличное от используемого ОС. Если вы контролируете код PHP, вы должны знать, делаете ли вы это, и все будет в порядке.
Но весь вопрос о том, какой часовой пояс использует сервер MySQL, может быть касательным, потому что запрос сервера о том, в каком часовом поясе он находится, абсолютно ничего не говорит о данных в базе данных. Читайте дальше для деталей:
Дальнейшее обсуждение :
Если вы контролируете сервер, конечно, вы можете убедиться, что часовой пояс является известным количеством. Если вы не контролируете сервер, вы можете установить часовой пояс, используемый вашим соединением, следующим образом:
set time_zone = '+00:00';
Это устанавливает часовой пояс в GMT, так что любые дальнейшие операции (например now()
) будут использовать GMT.
Обратите внимание, что значения времени и даты не хранятся вместе с информацией о часовом поясе в MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Поэтому знание часового пояса сервера важно только с точки зрения функций, которые получают время прямо сейчас, например now()
, unix_timestamp()
и т. Д .; он ничего не говорит вам о том, какой часовой пояс используют даты в данных базы данных. Вы можете предположить, что они написаны с использованием часового пояса сервера, но это предположение может быть ошибочным. Чтобы узнать часовой пояс любых дат или времени, хранящихся в данных, вы должны убедиться, что они хранятся вместе с информацией о часовом поясе или (как я знаю), всегда в GMT.
Почему предполагается, что данные были записаны с использованием часового пояса сервера? Ну, во-первых, данные могут быть записаны с использованием соединения, которое устанавливает другой часовой пояс. База данных, возможно, была перемещена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая была перемещена из Техаса в Калифорнию). Но даже если данные записаны на сервере с его текущим часовым поясом, они все равно неоднозначны. В прошлом году в Соединенных Штатах летнее время было выключено в 2 часа ночи 1 ноября. Предположим, мой сервер в Калифорнии использует часовой пояс Тихого океана, и у меня есть значение2009-11-01 01:30:00
в базе данных. Когда это было? Было ли это 1:30 утра 1 ноября по тихоокеанскому времени или 1:30 ночи 1 ноября по тихоокеанскому времени (час спустя)? У вас нет абсолютно никакого способа узнать. Мораль: всегда храните дату / время в GMT (что не делает DST) и конвертируйте в желаемый часовой пояс по мере необходимости.