Как мне узнать текущий часовой пояс MySQL?

217

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

ОБНОВИТЬ

Это не выводит никакой действительной информации:

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

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

user198729
источник
3
«мы можем задействовать PHP здесь» - и будет ли этот экземпляр php всегда находиться на той же машине, что и сервер MySQL?
VolkerK
Да, они будут на одной машине.
user198729
10
Попробуйте, @@system_time_zoneкак указано в моем ответе ниже.
Андрей
Поскольку вопрос был задан, было добавлено больше ответов, возможно, пересмотреть принятый ответ?
Тимо Хуовинен
1
Несмотря на то, что сервер MySQL и PHP находятся на одном сервере, они могут выбирать разные часовые пояса в зависимости от своих настроек. И эти времена могут отличаться от того, что показывает ваша ОС и PHP / MySQL.
Бимал Пудель

Ответы:

227

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

TJ Crowder
источник
5
@ user198729: Это не бессмысленно , хотя и не так полезно, как я надеялся. Что это значит: спросите ОС, MySQL работает над этим.
TJ Crowder
Просто любопытно, почему мы должны сами установить часовой пояс, а затем восстановить его? Такого рода поражение цели не так ли? Я хочу спросить у MySQL о часовом поясе, потому что я не знаю ответа. Может быть, я запутался и ошибся. Может кто-нибудь объяснить?
Сентил
1
@Senthil DATETIMEТип mySQL не содержит информацию о часовом поясе. Поэтому я думаю, что предполагаемая базовая философия заключается в том, чтобы MySQL был настолько слепым, насколько это возможно, к часовому поясу - это означает, что пользователь должен придерживаться одного часового пояса, либо UTC, либо часового пояса, в котором находится сервер, хранить все в этой зоне и делать какие-либо преобразования на уровне приложения или с помощью CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) По крайней мере, так я всегда понимал, как это должно работать, глядя на разреженные опции, которые mySQL предоставляет в этой области.
Пекка
Спасибо, но это все еще не решено, как я могу получить информацию о tz по результату now()в PHP?
user198729
Я полностью согласен с частью "придерживаться одного часового пояса при сохранении временной метки" .. Но это-> "... или часовой пояс, в котором находится сервер ..", как вы это выясните? Допустим, вы сохранили все значения меток времени в формате UTC. Но ваш сервер находится в каком-то другом часовом поясе, и вы хотите показать значения меток времени в соответствии с этим часовым поясом . Итак, как вы узнаете, в каком часовом поясе находится ваш сервер? Только тогда вы можете передать какое-либо значение в CONVERT_TZ (), чтобы преобразовать его правильно?
Сентил
196

Запрос ниже возвращает часовой пояс текущего сеанса.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
JohnZ
источник
6
Это действительно правильный ответ, потому что он демонстрирует, что «SYSTEM» распознается как часовой пояс в преобразовании, что делает его полностью достаточным для преобразования, например, NOW () в любой часовой пояс.
Nilskp
5
Спасибо, благодаря этому я смог получить select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
нужный
97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)проще
Якуб Врана
3
Или SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);получить разницу в секундах.
Philfreo
106

Просто SELECT @@system_time_zone;

Возврат PST(или что-либо, имеющее отношение к вашей системе).

Если вы пытаетесь определить часовой пояс сеанса, вы можете использовать этот запрос:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Который будет возвращать часовой пояс сеанса, если он отличается от системного часового пояса.

Андрей
источник
6
Единственным недостатком является то, что если часовой пояс изменится из-за изменения летнего времени, он все равно сообщит о том, который был «запомнен» во время запуска сервера, см. Ошибку MySQL 9518
Марк
72

Как Якуб Vrána (Создатель или Adminer и NotORM ) упоминает в комментариях, чтобы выбрать текущее смещение часового пояса в TIMEиспользовании:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Он вернется: 02:00:00если ваш часовой пояс +2: 00 на эту дату

Я сделал здесь шпаргалку: должен ли MySQL иметь часовой пояс с UTC?

Тимо Хуовинен
источник
Или SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);получить разницу в секундах.
Philfreo
дополнение к @philfreo - обратите внимание, что параметры должны быть обращены в TIMESTAMPDIFF по сравнению с TIMEDIFF. Чтобы взять пример, приведенный в этом ответе, если TIMEDIFF вернется 02:00:00, соответствующий TIMESTAMPDIFF вернется, -2если единицей является ЧАС, -120если единицей является МИНУТА и т. Д. Чтобы получить знак, соответствующий часовому поясу , поменяйте местами параметры: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())вернет ожидаемый 120для часового пояса +2: 00. Причина для указания минут состоит в том, что есть несколько часовых поясов со смещением 30 или 45 минут, см. En.wikipedia.org/wiki/Time_zone
ToolmakerSteve
1
это гораздо лучший ответ, чем принятый ответ, так как он отвечает на вопрос напрямую и дает решение, а не только теорию.
supersan
10

Чтобы получить текущий часовой пояс MySQL, вы можете сделать следующие вещи:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Теперь, если вы хотите изменить часовой пояс mysql, тогда:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 
Абхинав Бхардвадж
источник
6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Это вернет часовой пояс как целое число (например:) -6, обрабатывая положительное или отрицательное время (вот где EXTRACTвступает в игру: HOURодна функция возвращает отрицательные часовые пояса как положительные).

Люка Фагиоли
источник
6

Чтобы кто-нибудь пришел, чтобы найти часовой пояс MySQL БД.

С помощью этого запроса вы можете получить текущий часовой пояс:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+
ttrasn
источник
4

Упоминание команды в описании возвращает "SYSTEM", которая указала, что она использует часовой пояс сервера. Что не полезно для нашего запроса.

Следующий запрос поможет понять часовой пояс

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

Выше запрос даст вам интервал времени по отношению к всемирному координированному времени (UTC). Таким образом, вы можете легко проанализировать часовой пояс. если часовой пояс базы данных IST, выходной будет 5:30

UTC_TIMESTAMP

В MySQL UTC_TIMESTAMP возвращает текущую дату и время UTC в виде значения в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС» или ГГГГММДДЧЧММСС.uuuuuuu в зависимости от использования функции, то есть в строковом или числовом контексте.

СЕЙЧАС()

СЕЙЧАС () функция. MySQL NOW () возвращает значение текущей даты и времени в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС» или в формате ГГГГММДДЧЧММСС.uuuuuuu в зависимости от контекста (числового или строкового) функции. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () являются синонимами NOW ().

Amitesh
источник
2

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

Пекка
источник
@user, не могли бы вы, пожалуйста, указать в своем вопросе, какую именно информацию вы ищете (часовой пояс сервера? клиентский?) и какие инструменты в вашем распоряжении? Вы упоминаете PHP. Можете ли вы получить доступ к командной строке?
Пекка
5
@ Пользователь также, я нахожу, что вы наталкиваетесь на какие-то глупые ответы от людей, которые пытаются быть полезными, и не совсем ошибаются. Я не возражаю против голосования и потери очков, но ваше отношение не совсем вдохновляет искать дальнейшее решение.
Пекка
3
@ Как я уже сказал, ваше отношение не побуждает меня искать дальнейшие ответы, особенно в свете скудной информации, которую вы предоставляете. Сожалею.
Пекка
3
@ user198729: Ничего себе, потерять отношение. Пекка такой парень, который действительно помогает людям. Если одной вежливости недостаточно, чтобы мотивировать вас, попробуйте себя заинтересовать.
TJ Crowder
2
Только мои мысли: я бы не обиделся, если бы пользователь сделал то же самое с моим постом. Я имею в виду, что крайний срок давления или разочарование добавляет некоторых грубых углов вокруг людей, но я думаю, что мы должны допустить это в некоторой степени. Может быть, я слишком прощаю: |
Сентил
1

Мой PHP-фреймворк использует

SET LOCAL time_zone='Whatever'

на после подключения, где «Безотносительно» == date_default_timezone_get ()

Не мое решение, но это гарантирует, что SYSTEMчасовой пояс сервера MySQL всегда совпадает с часовым поясом PHP

Так что, да, PHP сильно вовлечен и может повлиять на него

vladkras
источник
1

Чтобы узнать текущее время в соответствии с вашим часовым поясом, вы можете использовать следующее (в моем случае это «+5: 30»)

выберите DATE_FORMAT (convert_tz (now (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d')

Санжой Канрар
источник
0

Вам просто нужно перезапустить mysqld после изменения часового пояса системы.

Глобальный часовой пояс MySQL занимает часовой пояс Системы. Когда вы изменяете любой такой атрибут системы, вам просто нужно перезапустить Mysqld.

Буря молодая
источник
после изменения часового пояса в ОС, MySQL вставляет будет использовать новый часовой пояс, но выберите сейчас (); и выберите current_timestamp; Команды все еще будут использовать старый часовой пояс. Чтобы синхронизировать все это, служба mysql должна быть перезапущена.
Манодж Кумар Г
0

Вставьте фиктивную запись в одну из ваших баз данных с временной меткой. Выберите эту запись и получите значение временной метки. Удалить эту запись. Получает точно часовой пояс, который сервер использует для записи данных, и игнорирует часовые пояса PHP.

в подветренной стороне
источник
0

Вы можете попробовать следующее:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Здесь вы можете указать разницу во времени в секундах

Бала Каян
источник
1
Вы не должны добавлять и вычитать смещения. с дневным светом говоря , правила и т.д. , это минное поле
EWEB
0

Используйте LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')для получения значения в формате часового пояса MySQL, с которым вы можете удобно использовать CONVERT_TZ(). Обратите внимание, что полученное вами смещение часового пояса действительно только в тот момент, когда выражение вычисляется, поскольку смещение может меняться со временем, если у вас есть переход на летнее время. Тем не менее, выражение полезно вместе с тем, NOW()чтобы хранить смещение с местным временем, которое устраняет неоднозначность того, что NOW()дает. (В часовых поясах DST происходит переход NOW()назад на один час в год, поэтому он имеет несколько повторяющихся значений для разных моментов времени).

РТК
источник
0

Может быть

select timediff(current_time(),utc_time())

Вы не получите значение часового пояса напрямую таким образом.

@@global.time_zone не может использоваться как переменная, и возвращает значение 'SYSTEM' .

Если вам нужно использовать ваш запрос в сеансе с измененным часовым поясом session SET TIME_ZONE =, то вы получите его с помощью @@session.time_zone. Если вы запросите @@global.time_zone, то вы получите'SYSTEM' .

Если вы пытаетесь datediff, date_subили timediffс now()иutc_time() , то вы, вероятно, столкнетесь с проблемами конверсии.

Но вещи, предложенные выше, вероятно, будут работать по крайней мере с некоторыми версиями сервера. Моя версия 5.5.43-37 и является хост-решением.

dwaid
источник
Это не дает четкого ответа на вопрос. Возможно, вы можете отредактировать его, чтобы сосредоточиться на заданном вопросе.
Могсдад
-3

Попробуйте использовать следующий код:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
Оскар Рохас
источник