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

339

На одном сервере, когда я запускаю:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)

На другом сервере:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
О, мой бог
источник
Здесь разница не только в часовых поясах, но и не столь незначительный сдвиг во времени: «Поговорите со своим администратором базы данных ntp- и посмотрите, что подходит именно вам!»
colm.anseo
@ colm.anseo Успокойся, вероятно, есть разница между выполнением запросов
HosseyNJF
1
@HosseyNJF на 7 минут? Перерыв на кофе между сравнениями?
colm.anseo

Ответы:

525

Я подумал, что это может быть полезно:

Есть три места, где часовой пояс может быть установлен в MySQL:

В файле "my.cnf" в разделе [mysqld]

default-time-zone='+00:00'

@@ global.time_zone переменная

Чтобы увидеть, какое значение они имеют:

SELECT @@global.time_zone;

Чтобы установить для него значение, используйте один из них:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';

(Использование именованных часовых поясов, таких как «Европа / Хельсинки», означает, что вам необходимо правильно заполнить таблицу часовых поясов.)

Имейте в виду, что +02:00это смещение. Europe/Berlinявляется CESTчасовым поясом (который имеет два смещения) и является часовым временем, которое соответствует определенному смещению.

переменная @@ session.time_zone

SELECT @@session.time_zone;

Чтобы установить его, используйте любой из них:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

Оба могут возвращать SYSTEM, что означает, что они используют часовой пояс, установленный в my.cnf.

Чтобы имена часовых поясов работали, необходимо настроить таблицы с информацией о часовых поясах: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Я также упоминаю, как заполнить эти таблицы в этом ответе .

Чтобы получить текущее смещение часового пояса как TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

Чтобы получить текущую метку времени UNIX:

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());

Чтобы получить столбец отметки времени как отметку времени UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Чтобы получить столбец даты и времени UTC в качестве метки времени UNIX

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

Примечание. Изменение часового пояса не приведет к изменению сохраненной даты и времени. , но будет отображать другое время-дату для существующих столбцов временной метки, поскольку они внутренне сохраняются как метки времени UTC и внешне отображаются в текущем часовом поясе MySQL.

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

Тимо Хуовинен
источник
3
+00:00это не часовой пояс, это смещение времени. Что происходит с DST? Это остается в +0 круглый год?
мпен
1
@ Марк Я не уверен, в документах говорится, что при настройке time_zone="+00:00"вы устанавливаете часовой пояс, используя смещение от UTC, учитывая, что установленное значение никогда не меняется и что UTC не соответствует DST, я могу предположить, что он остается неизменным в течение всего года.
Тимо Хуовинен
1
@TimoHuovinen Извините, я имел в виду, что это +00:00 похоже на смещение, поэтому странно, что MySQL выбрал его для представления UTC вместо того, чтобы просто использовать строку «UTC». Спасибо за информацию.
mpen
1
Я установил +00: 00, но я получаю эту ошибку: ошибка: найдена опция без предшествующей группы в файле конфигурации: /etc/my.cnf
János
5
в Win7 путь к файлу настроек mysqlC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
84

Для тех, кто все еще имеет эту проблему:

value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"

Работал на меня. Просто добавьте ?serverTimezone=UTCв конце.

Ноэль Мерфи
источник
Если мой часовой пояс UTC + 7, как я могу указать это в строке подключения? Я попытался добавить "? ServerTimezone = UTC + 7", и это не работает.
Chiến Nghê
1
Вопрос был не о JDBC, а о самом MySQL.
Луиз
2
@ ChiếnNghê: Вы должны использовать Asia/Ho_Chi_Minhвместо UTCBTW, вопрос об изменении часового пояса MySQL. Поэтому, пожалуйста, посмотрите на ответ @Timo. Если у вас проблемы с докером MySQL, добавьте среду TZ, и она должна работать.
Лием Ле
2
Это только информирует JDBC о часовом поясе сервера, но не меняет его. Чтобы установить часовой пояс сессии, проверьте ответы, которые используютSET time_zone=...
Никола Михайлович
Я получал ошибку CDT, но это исправило ее для меня.
Akexis
58

Когда вы можете настроить сервер часового пояса для MySQL или PHP:

Помните:

  1. Изменить систему часовых поясов. Пример для Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Перезагрузите сервер или вы можете перезапустить Apache 2 и MySQL:

    /etc/init.d/mysql restart
Джейн
источник
2
Может быть, этот подход не может быть правильным. Подумайте о ситуации с сервером с UTC, но ваше приложение отправляет данные в страну с UTC-0600. Чтобы настроить часовой пояс для MySQL, может быть намного лучше.
ivanleoncz
1
Особенно если вы работаете в области, которая охватывает несколько часовых поясов.
Алексис Вилке
57

Чтобы установить его для текущей сессии, выполните:

SET time_zone = timezonename;
Джеймс Скидмор
источник
14
SELECT @@ session.time_zone;
Джеймс Скидмор
1
Я пытаюсь исправить некоторые ошибки в моей системе, и мне нужно установить часовой пояс UTC, а не GMT. Знаете ли вы, если я установлю «-0: 00» или «+00: 00», это аннотация UTC или GMT? Я вроде не нахожу эту конкретную информацию. Ура!
rafa.ferreira
@Castanho, я уверен, что любой из них будет работать нормально. Ознакомьтесь с объяснением этого вопроса: stackoverflow.com/questions/3466630/…
Джеймс Скидмор
Значение для часового пояса может быть таким же, как значение, установленное в PHP, например SET time_zone = 'America/Boise'. Спасибо за ответ, Джеймс Скидмор!
Адам Ф
1
@the_nuts да, SET time_zone = 'UTC';настройки теряются при перезапуске сервера
Тимо Хуовинен
48

Просто запустите это на вашем сервере MySQL:

SET GLOBAL time_zone = '+8:00';

Где +8: 00 будет ваш часовой пояс.

Рико Чан
источник
14
Обратите внимание, что это только временно, пока вы не перезапустите Mysql
rubo77
Редко кто-то имеет привилегии суперпользователя при подключении к БД. Настройка, @@session.time_zoneкак описано в других ответах, является гораздо лучшим маршрутом.
colm.anseo
16

Эта работа для меня для места в Индии:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Свапнил биджве
источник
вам нужно выполнить это как запрос к MySQL или написать в my.conf со следующим синтаксисом default-time-zone = '+05: 30'
Swapnil Bijwe
11

Вы можете указать часовой пояс сервера по умолчанию при запуске, см. Http://dev.mysql.com/doc/refman/5.1/en/server-options.html и, в частности, --default-time-zone=timezoneпараметр. Вы можете проверить глобальные и сеансовые часовые пояса с

SELECT @@global.time_zone, @@session.time_zone;

установить одно или оба с помощью SETоператора, & c; см. http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html для более подробной информации.

Алекс Мартелли
источник
11

Имейте в виду, что «Страна / Зона» иногда не работает ... Эта проблема не зависит от операционной системы, версии MySQL и аппаратного обеспечения - я встречал ее с FreeBSD 4 и Slackware Linux с 2003 года по сегодняшний день. MySQL с версии 3 до последней версии исходного кода. Это ODD, но это случается. Например:

root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8

drwxr-xr-x  2 root root 4096 Apr 10  2013 .
drwxr-xr-x 22 root root 4096 Apr 10  2013 ..
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx  1 root root   21 Jul  8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx  1 root root   15 Jul  8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx  1 root root   37 Jul  8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx  1 root root   19 Jul  8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   20 Jul  8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#

И такое утверждение должно работать:

SET time_zone='US/Eastern';

Но у вас есть эта проблема:

Код ошибки: 1298. Неизвестный или неправильный часовой пояс: 'EUS / Eastern'

Взгляните на подпапку в вашем каталоге информации о зоне и посмотрите АКТУАЛЬНОЕ имя файла для символической ссылки, в данном случае это EST5EDT. Тогда попробуйте это утверждение:

SET time_zone='EST5EDT';

И это на самом деле работает, как и должно! :) Помните об этом трюке; Я не видел, чтобы это было задокументировано в руководствах MySQL и официальной документации. Но чтение соответствующей документации является обязательной вещью: официальная документация по часовому поясу MySQL 5.5 - и не забывайте загружать данные часового пояса на ваш сервер вот так (запустите от имени пользователя root!):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Трюк номер один - это должно быть сделано именно под пользователем root MySQL. Он может дать сбой или привести к неработающему результату даже от пользователя, который имеет полный доступ к базе данных MySQL - я сам видел сбой.

Алексей Веснин
источник
Скажите, пожалуйста, ваш uname -a и дополнительную информацию - у вас есть несколько рабочих случаев на рабочем столе и сервере Ubuntu.
Алексей Веснин
7

Это вопрос 10 лет, но в любом случае вот что сработало для меня. Я использую MySQL 8.0 с Hibernate 5 и SpringBoot 4.

Я попробовал вышеуказанный принятый ответ, но у меня не получилось, у меня сработало следующее:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

Если это поможет, не забудьте высказать свое мнение: D

хамза сабля
источник
4

Древний вопрос с еще одним предложением:

Если вы недавно изменили часовой пояс ОС, например, через:

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime

... MySQL (или MariaDB) не заметит, пока вы не перезапустите службу db:

service mysqld restart

(или)

service mariadb restart
inanutshellus
источник
3

Если вы используете MySql Workbench, вы можете установить это, открыв представление администратора и выбрав вкладку Advanced. Верхний раздел - «Локализация», и первый флажок должен быть «default-time-zone». Установите этот флажок, а затем введите желаемый часовой пояс, перезагрузите сервер, и все будет хорошо.

Тейлор Лафринере
источник
2
Проблема связана с MySQL, а не с конкретной программой.
Федорки "ТАК прекратить вредить"
3
Ничего подобного не нашел.
Kzqai
1
Ничего подобного
Green
Для MySQL Workbench 6.3: Экземпляр => Файл опций => Общие => Международный
paulus
5
[ ОБНОВЛЕНИЕ для MySQL Workbench 8.0 ] Выберите «Сервер» => «Файл опций» и на вкладке «Общие» см. Ниже раздел «Международные» . Там будет флажок «default-time-zone» вместе со связанным полем. Таким образом, вы можете установить значение часового пояса по умолчанию там.
informatik01
3

Сначала выясните, какой часовой пояс вы можете запросить

SHOW VARIABLES LIKE '%time_zone%'; 

Ваш вывод должен быть примерно таким:

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

Затем, если вы хотите подтвердить, что вы находитесь в каком-то часовом поясе, например, CDT, а не в EST, вы можете проверить, в какое время, по вашему мнению, находится ваш компьютер,

SELECT NOW();

Если это не то время, которое вы хотите, вам нужно изменить его ... все, что вам нужно сделать, это SET time_zone = timezone_name. Убедитесь, что он в Continent/Cityформате.

Если вы находитесь на общем сервере, потому что у вас есть хостинг, пожалуйста, обратитесь к этим ответам относительно изменения файла php.ini или файла .htaccess.

Эрик Тоор
источник
1
Я попробовал mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eсначала, а потом SET time_zone = timezone_nameработал нормально.
Баракат Тюрки
1

Вы должны установить часовой пояс вашего местоположения. Итак, следуйте нижеприведенному процессу.
Откройте MSQLWorkbench и напишите простую команду sql, подобную этой;

select now();

А также ваш URL может быть таким;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
Харун Угур
источник
@LuFFy Это то, что мне было интересно, поэтому для каждого db-соединения часовой пояс должен быть установлен, ЕСЛИ мы используем часовой пояс области сеанса, а не «глобальный» часовой пояс. Хорошо использовать сессионный охват, если приложение может иметь пользователей в разных часовых поясах, верно?
Вальтер Экхольм
1

Чтобы установить стандартный часовой пояс на MariaDB, вам нужно перейти в файл 50-server.cnf .

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Затем вы можете ввести следующую запись в разделе MySQL.

default-time-zone='+01:00'

Пример:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

Изменение должно быть сделано через файл конфигурации, в противном случае сервер MariaDB сбросит таблицы mysql после перезапуска!

Лукас Кунце
источник
0

В Windows (IIS), чтобы иметь возможность установить GLOBAL time_zone = 'Europe / Helsinki' (или что-то еще), сначала необходимо заполнить таблицы описания часового пояса MySQL.

Я скачал их по этой ссылке https://dev.mysql.com/downloads/timezones.html

После запуска загруженного SQL-запроса я смог установить глобальный часовой пояс и решить проблему, в которой находился SELECT NOW (); возвращал GMT, а не BST.

Стюарт Киркпатрик
источник
Я мог бы использовать числовой формат «+01: 00» вместо «Европа / Стокгольм», поэтому мне не пришлось загружать таблицы описания часовых поясов, я думаю.
Вальтер Экхольм
0

В моем случае решение состояло в том, чтобы установить для параметра serverTimezone в расширенных настройках соответствующее значение (CET для моего часового пояса).

Поскольку я использую IntelliJ, я использую его модуль базы данных. При добавлении нового подключения к базе данных и после добавления всех соответствующих параметров на вкладке Общие произошла ошибка на кнопке «Проверить подключение». Опять же, решение состоит в том, чтобы установить параметр serverTimezone во вкладке Advanced.

ognjenkl
источник
0

Если кто-то использует хостинг GoDaddy Shared Hosting, вы можете попробовать следующее решение, работавшее для меня.

При запуске соединения с БД установите команду time_zone в моем объекте PDO, например:

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

Где "+05: 30" - часовой пояс Индии. Вы можете изменить его в соответствии с вашими потребностями.

После этого; все процессы MySQL, связанные с датой и временем, устанавливаются с требуемым часовым поясом.

Источник: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861.

Ашиш Пандей
источник