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