Из руководства ( раздел 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) и конвертируйте в нужный часовой пояс по мере необходимости.