Comment définir le fuseau horaire de MySQL?
sur un serveur, quand j'exécute:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)
sur un autre serveur:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
12 réponses
j'ai pensé que cela pourrait être utile:
il y a trois endroits où le fuseau horaire pourrait être défini dans MySQL:
Dans le fichier "my.cnf "dans la section [mysqld]
default-time-zone='+00:00'
@@global.time_zone variable
pour voir leur valeur:
SELECT @@global.time_zone;
Pour définir une valeur pour utiliser un:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';
(en utilisant named des fuseaux horaires comme "Europe / Helsinki" signifie que vous devez avoir une table de fuseau horaire correctement peuplée.)
Gardez à l'esprit que +02:00
est un décalage. Europe/Berlin
est un fuseau horaire (qui a deux offsets) et CEST
est un temps d'horloge qui correspond à un offset spécifique.
@@session.time_zone variable
SELECT @@session.time_zone;
utilisez l'un ou l'autre:
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
les deux pourraient système de retour ce qui signifie qu'ils utilisent le fuseau horaire défini dans mon.cnf.
pour que les noms de fuseaux horaires fonctionnent, vous devez configurer vos tables d'information de fuseaux horaires. les tables doivent être remplies: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Je mentionne également comment remplir ces tableaux dans cette réponse .
pour obtenir le décalage du fuseau horaire en cours comme TIME
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
il sera retour 02:00:00 si votre fuseau horaire est de +2:00.
pour obtenir le timestamp UNIX actuel:
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
Pour obtenir la colonne timestamp UNIX timestamp
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
Pour obtenir un UTC colonne datetime comme un timestamp UNIX
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
Note: le changement du fuseau horaire ne modifiera pas le datetime ou l'horodatage stocké , mais il affichera un datetime différent pour les colonnes d'horodatage étant stockées en interne sous forme D'horodateurs UTC et affichées en externe dans le fuseau horaire MySQL courant.
j'ai fait un cheatsheet ici: MySQL doit-il avoir son fuseau horaire réglé sur UTC?
pour le définir pour la session en cours, faites:
SET time_zone = timezonename;
quand vous pouvez configurer le serveur time zone pour MySQL ou PHP:
Rappelez-vous:
-
Changement de fuseau horaire du système. Exemple pour Ubuntu:
$ sudo dpkg-reconfigure tzdata
-
redémarrez le serveur ou vous pouvez redémarrer Apache 2 et MySQL:
/etc/init.d/mysql restart
exécutez simplement ceci sur votre serveur MySQL:
SET GLOBAL time_zone = '+8:00';
Où +8:00 sera votre fuseau horaire.
pour toute personne ayant encore ce problème:
value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"
travaillait pour moi. Il suffit d'ajouter ?serverTimezone=UTC
à la fin.
Ce travail pour moi pour un emplacement en Inde:
SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
vous pouvez spécifier le fuseau horaire par défaut du serveur lorsque vous le démarrez, voir http://dev.mysql.com/doc/refman/5.1/en/server-options.html et plus précisément l'option --default-time-zone=timezone
. Vous pouvez consulter les fuseaux horaires global et session avec
SELECT @@global.time_zone, @@session.time_zone;
définir un ou l'autre ou les deux avec la SET
, &c; voir http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html pour beaucoup plus de détails.
si vous utilisez PDO:
$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");
si vous utilisez MySQLi:
$db->MySQLi->query("SET time_zone='".$offset."';");
pour en savoir plus sur le formatage de l'offset, Cliquez ici: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/
gardez à l'esprit que "pays/Zone" ne fonctionne pas parfois... Ce problème n'est pas lié à L'OS, à la version MySQL et au matériel - je l'ai rencontré depuis FreeBSD 4 et Slackware Linux en 2003 jusqu'à aujourd'hui. MySQL de la version 3 jusqu'à la dernière source. C'est BIZARRE, mais il NE se passe. Par exemple:
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#
et une déclaration comme celle-ci est censée fonctionner:
SET time_zone='US/Eastern';
mais vous avez ce problème:
Code D'Erreur: 1298. Fuseau horaire inconnu ou incorrect: 'EUS / Eastern '
regardez le sous-dossier dans votre répertoire d'information de zone, et voyez le nom réel du fichier pour symlink, dans ce cas C'est EST5EDT. Alors essayez cette déclaration à la place:
SET time_zone='EST5EDT';
et ça fonctionne comme prévu! :) Gardez cette astuce à l'esprit; je n'ai pas vu qu'elle soit documentée dans les manuels MySQL et la documentation officielle. Mais la lecture de la la documentation correspondante est obligatoire: MySQL 5.5 timezone documentation officielle - et n'oubliez pas de charger les données timezone dans votre serveur juste comme cela (exécuter comme utilisateur root!):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Tour Numéro un - il doit être fait exactement sous MySQL utilisateur root. Il peut échouer ou produire le résultat non-travail même de l'utilisateur qui a le plein accès à une base de données MySQL - j'ai vu le bug moi-même.
question ancienne avec une suggestion de plus:
si vous avez modifié récemment le fuseau horaire de L'OS, p.ex. via:
unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime
... MySQL (ou MariaDB) ne remarquera pas jusqu'à ce que vous redémarriez le service de base de données:
service mysqld restart
(ou)
service mariadb restart
si vous utilisez le MySql Workbench vous pouvez configurer cela en ouvrant la vue administrateur et sélectionnez l'onglet Avancé. La section supérieure est " Localisation "et la première case doit être"default-time-zone". Cochez cette case et entrez ensuite votre fuseau horaire désiré, redémarrez le serveur et vous devriez être bon d'aller.
, Vous devez configurer le fuseau horaire de votre emplacement. Ainsi que suit ci-dessous le processus
Ouvrez votre MSQLWorkbench
ecrire une commande sql simple comme celle-ci;
select now();
et aussi votre url pourrait être comme ceci;
url = " jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";