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

228

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

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)
Теги:
timezone

12 ответов

380

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

Есть три места, где в 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 variable

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());

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

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

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

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

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

Я сделал чит-коды здесь: Должен ли MySQL установить часовой пояс в UTC?

  • 4
    Для тех, кто интересуется, Тимо говорит о разделе [mysqld] . :)
  • 3
    +00:00 не часовой пояс, это смещение времени. Что происходит с DST? Это остается в +0 круглый год?
Показать ещё 20 комментариев
48

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

SET time_zone = timezonename;
  • 0
    спасибо, а как проверить текущий часовой пояс?
  • 11
    SELECT @@ session.time_zone;
Показать ещё 7 комментариев
47

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

Запомнить:

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

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

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

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

SET GLOBAL time_zone = '+8:00';

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

  • 6
    Обратите внимание, что это только временно, пока вы не перезапустите Mysql
  • 0
    Это не временно, потому что вы устанавливаете его GLOBAL, но вы, конечно, должны иметь привилегии суперпользователя, чтобы использовать этот код.
Показать ещё 1 комментарий
23

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

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

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

  • 0
    это работает только для этого типа соединения?
  • 0
    Если мой часовой пояс UTC + 7, как я могу указать это в строке подключения? Я попытался добавить "? ServerTimezone = UTC + 7", и это не работает.
Показать ещё 3 комментария
10

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

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

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

7

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

Взгляните на подпапку в вашем каталоге информации о зоне и просмотрите имя файла ACTUAL для символической ссылки, в этом случае это EST5EDT. Затем попробуйте следующее утверждение:

SET time_zone='EST5EDT';

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

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

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

  • 0
    не работает для сервера Ubuntu.
  • 0
    Пожалуйста, сообщите мне свой uname -a и дополнительную информацию - у вас есть несколько рабочих случаев на рабочем столе и сервере Ubuntu.
5

Если вы используете 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/

3

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

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

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

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

service mysqld restart

(или)

service mariadb restart
1

Если вы используете MySql Workbench, вы можете установить это, открыв представление администратора и выбрав вкладку "Дополнительно". Верхний раздел - "Локализация", а первый флажок должен быть "по умолчанию - зона времени". Установите этот флажок, а затем введите требуемый часовой пояс, перезапустите сервер, и вы должны быть добрым.

  • 2
    Проблема связана с MySQL, а не с конкретной программой.
  • 3
    Ничего подобного не нашел.
Показать ещё 3 комментария
-3

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

select now();

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

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню