Как мне установить часовой пояс MySQL? - PullRequest
270 голосов
/ 31 мая 2009

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

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)

Ответы [ 13 ]

441 голосов
/ 28 сентября 2013

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

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

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

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

@@ global.time_zone variable

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

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?

50 голосов
/ 31 мая 2009

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

SET time_zone = timezonename;
47 голосов
/ 10 февраля 2012

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

Помните:

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

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

    /etc/init.d/mysql restart
    
44 голосов
/ 22 апреля 2016

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

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

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

37 голосов
/ 17 апреля 2013

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

SET GLOBAL time_zone = '+8:00';

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

14 голосов
/ 03 октября 2016

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

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
9 голосов
/ 09 ноября 2013

Имейте в виду, что «Страна / Зона» иногда не работает ... Эта проблема не зависит от ОС, версии 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 - я сам видел этот сбой.

9 голосов
/ 31 мая 2009

Вы можете указать часовой пояс сервера по умолчанию при запуске, см. 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 для более подробной информации.

6 голосов
/ 29 сентября 2017

Если вы используете PDO:

$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");

Если вы используете MySQLi:

$db->MySQLi->query("SET time_zone='".$offset."';");

Подробнее о форматировании смещения здесь: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

4 голосов
/ 10 марта 2018

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

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

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

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

service mysqld restart

(или)

service mariadb restart
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...