Як встановити часовий пояс 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)

Тут не лише різниця в часовому поясі, але і не дуже суттєвий проміжок часу: "Порадьтеся з вашою DBA про 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/uk/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". Дякуємо за інформацію.
квітня

1
Я встановлюю +00: 00, але я отримую цю помилку: помилка: Знайдено варіант без попередньої групи у файлі config: /etc/my.cnf
János

5
у Win7 шлях до файлу налаштувань mysqlC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca

83

Для тих, хто все ще має цю проблему:

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 з наступним синтаксисом за замовчуванням-часовий пояс = '+05: 30'
Swapnil Bijwe

11

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

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

встановити один або обидва з SETвисловлюванням, & c; див. http://dev.mysql.com/doc/refman/5.1/uk/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

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


Скажіть, будь ласка, ваше уніме -а та інші деталі - є кілька робочих випадків на робочому столі та сервері 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

3

Якщо ви використовуєте MySql Workbench, ви можете встановити це, відкривши подання адміністратора та виберіть вкладку Додатково. Верхній розділ - "Локалізація", а перший прапорець повинен бути "Зона за замовчуванням". Поставте цей прапорець, а потім введіть потрібний часовий пояс, перезавантажте сервер, і вам слід добре пройти.


2
Питання пов'язане з MySQL, а не з конкретною програмою.
fedorqui 'ТАК перестаньте шкодити'

3
Нічого подібного не знайшов.
Kzqai

1
Нічого подібного
Зелений

Для MySQL Workbench 6.3: Instance => Файл параметрів => General => International
paulus

5
[ UPDATE для MySQL Workbench 8.0 ] Виберіть «Сервер» => «Параметри файлу», і на «Загальні» вкладки см нижче «International» розділі . Буде встановлено прапорець "Часовий пояс за умовчанням" разом із відповідним полем. Таким чином, ви можете встановити там значення часового поясу за замовчуванням .
informatik01

3

Спочатку з’ясуйте, що таке time_zone, ви можете запитати

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-connect повинен бути встановлений часовий пояс, якщо ми використовуємо часовий пояс сеансу, а не часовий пояс «глобальний». Корисно використовувати область сеансу, якщо програма може мати користувачів у різних часових поясах, правда?
Вальтер Екгольм

1

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

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

Потім ви можете ввести наступний запис у розділі mysqld.

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 = 'Європа / Гельсінкі' (або будь-що інше), таблиці описів часових зон MySQL потрібно спочатку заповнити.

Я завантажив їх із цього посилання https://dev.mysql.com/downloads/timezones.html

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


Я міг би використовувати формат чисел "+01: 00" замість "Європа / Стокгольм", тому мені не потрібно було завантажувати таблиці опису time_zone, я думаю.
Вальтер

0

У моєму випадку рішенням було встановити параметр serverTimezone у розширених налаштуваннях на відповідне значення (CET для мого часового поясу).

Під час використання IntelliJ я використовую його модуль баз даних. Під час додавання нового підключення до бази даних та після додавання всіх відповідних параметрів у вкладці Загальні сталася помилка на кнопці "Тест з'єднання". Знову ж таки, рішення полягає у встановленні параметра serverTimezone на вкладці Додатково.


0

Якщо хтось використовує спільний хостинг GoDaddy, ви можете спробувати наступне рішення, яке працювало на мене.

При запуску з'єднання БД встановіть команду 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.