Как получить текущий часовой пояс MySQL?
Кто-нибудь знает, есть ли такая функция в MySQL?
UPDATE
Это не выводит никакой достоверной информации:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Или, может быть, сам MySQL не может точно знать, что используется time_zone
, это прекрасно, мы можем включить PHP
здесь, пока я могу получить достоверную информацию, не похожую на SYSTEM
...
Ответы
Ответ 1
Из руководства (раздел 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.
Почему предполагается, что данные были написаны с испорченным временным часом сервера? Ну, во-первых, данные могут быть написаны с использованием соединения, которое устанавливает другой часовой пояс. Возможно, база данных была перенесена с одного сервера на другой, где серверы находились в разных часовых поясах (я столкнулся с этим, когда унаследовал базу данных, которая переместилась из Техаса в Калифорнию). Но , даже если данные записываются на сервере с его текущим часовым поясом, он все еще неоднозначен. В прошлом году, в Соединенных Штатах, Daylight Savings Time был отключен в 2:00 утра 1 ноября. Предположим, что мой сервер находится в Калифорнии, используя часовой пояс в Тихоокеанском регионе, и я имею значение 2009-11-01 01:30:00
в базе данных. Когда это было? Было ли это 1:30 утра 1-го ноября PDT, или 1:30 утра 1 ноября PST (час спустя)? У вас нет абсолютно никакого способа узнать. Мораль: всегда сохраняйте даты/время в GMT (что не делает DST) и конвертируйте в требуемый часовой пояс по мере необходимости.
Ответ 2
В приведенном ниже запросе указан часовой пояс текущего сеанса.
select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
Ответ 3
Просто
SELECT @@system_time_zone;
Возвращает PST
(или что-то, что относится к вашей системе).
Если вы пытаетесь определить часовой пояс сеанса, вы можете использовать этот запрос:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
который вернет часовой пояс сеанса, если он отличается от системного часового пояса.
Ответ 4
Как Jakub Vrána (Создатель или Adminer и NotORM) упоминается в комментариях, чтобы выбрать текущее смещение часового пояса в TIME
use:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Он вернет: 02:00:00
, если ваш часовой пояс +2: 00 для этой даты
Я сделал чит-коды здесь: Должен ли MySQL установить часовой пояс в UTC?
Ответ 5
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Это вернет часовой пояс как целое число (например: -6
), обрабатывая положительное или отрицательное время (здесь используется EXTRACT
: HOUR
только функция возвращает отрицательные часовые пояса как положительные).
Ответ 6
Чтобы получить текущий часовой пояс mysql, вы можете делать следующие вещи:
- SELECT @@system_time_zone;//из этого вы можете получить системный часовой пояс
- SELECT IF (@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone)//Это даст вам часовой пояс, если системный часовой пояс отличается от глобального часового пояса
Теперь, если вы хотите изменить часовой пояс mysql, тогда:
1. SET GLOBAL time_zone = '+00: 00'//это установит часовой пояс mysql в UTC
2. SET @@session.time_zone = "+00: 00";//этим вы можете синхронизировать часовой пояс только для своего конкретного сеанса.
Ответ 7
Отъезд Поддержка часовых поясов в mySQL и time_zone
. Помогает ли это?
Ответ 8
выберите sec_to_time (TIME_TO_SEC (curtime()) + 48000);
здесь вы можете указать свои разности во времени как sec
Ответ 9
Вам просто нужно перезапустить mysqld после изменения часового пояса системы.
Глобальный часовой пояс MySQL занимает часовой пояс системы. Когда вы меняете какой-либо такой атрибут системы, вам просто нужен перезапуск Mysqld.
Ответ 10
Вставьте фиктивную запись в одну из ваших баз данных с временной отметкой
Выберите эту запись и получите значение метки времени.
Удалите эту запись. Получает точно часовой пояс, используемый сервером для записи данных и игнорирует временные интервалы PHP.
Ответ 11
В моей фреймворке PHP используется
SET LOCAL time_zone='Whatever'
on после подключения, где 'Whatever' == date_default_timezone_get()
Не мое решение, но это гарантирует, что часовой пояс MySQL SYSTEM
всегда совпадает с PHP-кодом
Итак, да, PHP сильно вовлечен и может повлиять на него
Ответ 12
Используйте LPAD (TIME_FORMAT (TIMEDIFF (NOW(), UTC_TIMESTAMP),% H:% i), 6, + '), чтобы получить значение в формате часового пояса MySQL, которое удобно использовать с CONVERT_TZ(). Обратите внимание, что полученное вами смещение часового пояса действует только в момент, когда выражение оценивается, поскольку смещение может меняться со временем, если у вас есть летнее время. Тем не менее выражение полезно вместе с NOW() для хранения смещения с местным временем, что позволяет устранить то, что дает NOW(). (В часовых поясах DST, NOW() возвращается один час один раз в год, поэтому имеет несколько повторяющихся значений для разных точек во времени).
Ответ 13
Чтобы получить текущее время в соответствии с вашим часовым поясом, вы можете использовать следующее (в моем случае его "+5: 30" )
выберите DATE_FORMAT (convert_tz (now(), @@session.time_zone, '+ 05:30'), '% Y-% m-% d')
Ответ 14
Это может быть так же глупо, как и этот
выберите timediff (current_time(), utc_time())
as is whole mysql
вы не получите непосредственно значение часового пояса таким образом, но если не было другого пути...
@@global.time_zone нельзя использовать в представлении, так как это переменная, и она возвращает совершенно непригодное значение "SYSTEM" (у меня нет причин, почему кто-то ее беспокоил)
если вам нужно использовать ваш запрос в сеансе с измененной time_zone (по сеансу SET TIME_ZONE =) вы получите , что с @@session.time_zone
если вы запросите @@global.time_zone, вы получите "SYSTEM"
улов 22
если вы попробуете dateiff, date_sub или timediff с помощью now() и utc_time(), вы, вероятно, столкнетесь с проблемами конверсии, которые тихо посещаются сервером.
Худшая документация, которую я когда-либо видел, не помогла вам.
Отличная работа, все!
Но то, что было предложено выше, вероятно, будет работать, по крайней мере, с некоторыми версиями серверов, такими как мое (5.5.43-37).