Как мне установить часовой пояс MySQL?
На одном сервере, когда я запускаю:
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)
23 ответа
Я подумал, что это может быть полезно:
Есть три места, где часовой пояс может быть установлен в 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?
Для тех, кто все еще имеет эту проблему:
value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"
Работал на меня. Просто добавить ?serverTimezone=UTC
в конце.
Когда вы можете настроить сервер часового пояса для MySQL или PHP:
Помните:
Изменить систему часовых поясов. Пример для Ubuntu:
$ sudo dpkg-reconfigure tzdata
Перезагрузите сервер или вы можете перезапустить Apache 2 и MySQL:
/etc/init.d/mysql restart
Чтобы установить его для текущей сессии, выполните:
SET time_zone = timezonename;
Просто запустите это на вашем сервере MySQL:
SET GLOBAL time_zone = '+8:00';
Где +8:00 будет ваш часовой пояс.
Эта работа для меня для местоположения в Индии:
SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Этому вопросу уже 10 лет, но в любом случае вот что сработало для меня. Я использую MySQL 8.0 с Hibernate 5 и SpringBoot 4.
Я пробовал принятый выше ответ, но у меня это не сработало, у меня сработало следующее:
db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw
Если это поможет, не забудьте проголосовать за:D
Имейте в виду, что "Страна / Зона" иногда не работает... Эта проблема не зависит от операционной системы, версии 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 - я сам видел сбой.
При запуске вы можете указать часовой пояс по умолчанию для сервера, см. http://dev.mysql.com/doc/refman/5.1/en/server-options.html и, в частности, --default-time-zone=timezone
вариант. Вы можете проверить глобальные и сеансовые часовые пояса с
SELECT @@global.time_zone, @@session.time_zone;
установить один или оба с SET
заявление и т. д.; см. http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html для более подробной информации.
Если вы используете 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/
Отредактируйте файл конфигурации MySQL
sudo nano /etc/mysql/my.cnf
Прокрутите и добавьте их внизу. Изменить на соответствующий часовой пояс
[mysqld]
default-time-zone = "+00:00"
Перезагрузите сервер
sudo service mysql restart
Сначала выясните, какой часовой пояс вы можете запросить
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.
если вы используете именованный часовой пояс, это приводит к ошибке:
mysql> SET GLOBAL time_zone = "Asia/Bangkok";
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Bangkok'
можешь попробовать:
mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql
а потом:
SET GLOBAL time_zone = "Asia/Bangkok";
SET time_zone = "+07:00";
SET @@session.time_zone = "+07:00";
проверить который час:
SELECT NOW();
ссылка: https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation
Древний вопрос с еще одним предложением:
Если вы недавно изменили часовой пояс ОС, например, через:
unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime
... MySQL (или MariaDB) не заметит, пока вы не перезапустите службу db:
service mysqld restart
(или же)
service mariadb restart
Если вы используете MySql Workbench, вы можете установить это, открыв представление администратора и выбрав вкладку Advanced. Верхний раздел - "Локализация", и первый флажок должен быть "default-time-zone". Установите этот флажок, а затем введите желаемый часовой пояс, перезагрузите сервер, и все будет хорошо.
Чтобы установить стандартный часовой пояс на 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 после перезапуска!
Из MySQL Workbench 8.0 на вкладке сервера, если вы перейдете в состояние и системные переменные, вы можете установить его здесь.
Вы можете легко сделать это, изменив часовой пояс ОС, если он соответствует вашему сценарию.
В Ubuntu, чтобы получить список часовых поясов, выполните эту команду
sudo timedatectl list-timezones
Чтобы изменить часовой пояс ОС, запустите эту команду с вашим часовым поясом
timedatectl set-timezone America/New_York
Проверьте часовой пояс ОС, запустите
date
Затем перезапустите MySQL
sudo service mysql restart
В часовой пояс Chek в MySQL войдите и запустите
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Установите часовой пояс MYSQL на сервере, войдя на сервер mysql, где установите значение часового пояса по мере необходимости. Для IST
SET SESSION time_zone = '+5:30';
Тогда беги
SELECT NOW();
Вы должны установить часовой пояс вашего местоположения. Так что следуйте ниже процесса
Откройте MSQLWorkbench и напишите простую команду sql;
select now();
А также ваш URL может быть таким;
url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
Если кто-то использует общий хостинг 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
В Windows (IIS) для установки SET GLOBAL time_zone = 'Europe/Helsinki' (или чего-либо другого) сначала необходимо заполнить таблицы описания часового пояса MySQL.
Я скачал их по этой ссылке https://dev.mysql.com/downloads/timezones.html
После запуска загруженного SQL-запроса я смог установить глобальный часовой пояс и решить проблему, в которой находился SELECT NOW(); возвращал GMT, а не BST.
В моем случае решение заключалось в том, чтобы установить для параметра serverTimezone в дополнительных настройках соответствующее значение (CET для моего часового пояса).
Поскольку я использую IntelliJ, я использую его модуль базы данных. При добавлении нового соединения в базу данных и после добавления всех соответствующих параметров на вкладке "Общие" возникла ошибка на кнопке "Проверить соединение". Опять же, решение состоит в том, чтобы установить параметр serverTimezone на вкладке Advanced.