Как я получаю зону текущего времени MySQL?

Кто-либо знает, существует ли такая функция в MySQL?

ОБНОВЛЕНИЕ

Это не производит допустимой информации:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Или возможно сам MySQL не может знать точно time_zone используемый, это прекрасно, мы можем включить PHP здесь, пока я могу получить допустимую информацию не как SYSTEM...

185
задан hlopetz 3 September 2015 в 07:39
поделиться

2 ответа

Из руководства (раздел 9.6):

Текущие значения глобального и клиентского часовых поясов можно получить следующим образом:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Edit Приведенный выше результат дает 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:00 1 ноября. Предположим, мой сервер находится в Калифорнии и использует тихоокеанский часовой пояс, а в базе данных у меня есть значение 2009-11-01 01:30:00. Когда это было? Это было 1:30 утра 1 ноября PDT или 1:30 утра 1 ноября PST (на час позже)? У вас нет абсолютно никакой возможности узнать. Мораль: всегда храните даты/время в GMT (который не делает DST) и конвертируйте в нужный часовой пояс по мере необходимости.

212
ответ дан 23 November 2019 в 05:50
поделиться

Проверьте Поддержка часовых поясов сервера MySQL и системную переменную system_time_zone . Это поможет?

3
ответ дан 23 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: