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)
224
demandé sur Peter Mortensen 2009-05-31 04:02:07

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?

372
répondu Timo Huovinen 2017-05-23 11:54:47

pour le définir pour la session en cours, faites:

SET time_zone = timezonename;
48
répondu James Skidmore 2009-05-31 00:08:05

quand vous pouvez configurer le serveur time zone pour MySQL ou PHP:

Rappelez-vous:

  1. Changement de fuseau horaire du système. Exemple pour Ubuntu:

    $ sudo dpkg-reconfigure tzdata
    
  2. redémarrez le serveur ou vous pouvez redémarrer Apache 2 et MySQL:

    /etc/init.d/mysql restart
    
45
répondu jane 2018-06-05 04:31:28

exécutez simplement ceci sur votre serveur MySQL:

SET GLOBAL time_zone = '+8:00';

Où +8:00 sera votre fuseau horaire.

26
répondu Rico Chan 2016-11-28 13:12:16

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.

23
répondu Noel Murphy 2017-11-06 08:08:09

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";
10
répondu Swapnil Bijwe 2016-11-28 13:09:51

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.

9
répondu Alex Martelli 2009-05-31 00:09:55

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/

6
répondu MeKoo Solutions 2017-09-29 09:20:09

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.

5
répondu Alexey Vesnin 2017-03-30 20:39:47

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
3
répondu inanutshellus 2018-03-10 13:42:46

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.

1
répondu Taylor Lafrinere 2012-11-03 03:48:53

, 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";

-2
répondu harun ugur 2017-07-29 16:35:11