Comment définir le fuseau horaire de MySQL?

339

Sur un serveur, lorsque je lance:

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)
OMG
la source
Il n'y a pas seulement une différence de fuseau horaire ici - mais aussi une dérive temporelle pas si insignifiante: "Parlez-en à votre DBA ntp- et voyez ce qui vous convient!"
colm.anseo
@ colm.anseo Calmez-vous, c'est probablement la différence entre l'exécution des requêtes
HosseyNJF
1
@HosseyNJF de 7 minutes? Pause café entre les comparaisons?
colm.anseo

Réponses:

525

J'ai pensé que cela pourrait être utile:

Il existe trois endroits où le fuseau horaire peut être défini dans MySQL:

Dans le fichier "my.cnf" dans la section [mysqld]

default-time-zone='+00:00'

@@ variable globale.time_zone

Pour voir quelle valeur ils sont définis:

SELECT @@global.time_zone;

Pour lui attribuer une valeur, utilisez l'une ou l'autre:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';

(L'utilisation de fuseaux horaires nommés comme «Europe / Helsinki» signifie que vous devez disposer d'un tableau de fuseaux horaires correctement rempli.)

Gardez à l'esprit qu'il +02:00s'agit d'un décalage. Europe/Berlinest un fuseau horaire (qui a deux décalages) et CESTest une heure d'horloge qui correspond à un décalage spécifique.

@@ session.time_zone variable

SELECT @@session.time_zone;

Pour le définir, utilisez l'un ou l'autre:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

Les deux peuvent retourner SYSTEM, ce qui signifie qu'ils utilisent le fuseau horaire défini dans my.cnf.

Pour que les noms de fuseau horaire fonctionnent, vous devez configurer vos tableaux d'informations de fuseau horaire à remplir: 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 de fuseau horaire actuel sous la forme TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Il renverra 02:00:00 si votre fuseau horaire est +2: 00.

Pour obtenir l'horodatage UNIX actuel:

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());

Pour obtenir la colonne d'horodatage en tant qu'horodatage UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Pour obtenir une colonne datetime UTC en tant qu'horodatage UNIX

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

Remarque: modification du fuseau horaire ne modifiera pas l'heure ou l'horodatage stockés , mais il affichera une heure de date différente pour les colonnes d'horodatage existantes car elles sont stockées en interne en tant qu'horodatages UTC et affichées en externe dans le fuseau horaire MySQL actuel.

J'ai fait une feuille de triche ici: MySQL devrait - il avoir son fuseau horaire réglé sur UTC?

Timo Huovinen
la source
3
+00:00n'est pas un fuseau horaire, c'est un décalage horaire. Que se passe-t-il en ce qui concerne l'heure d'été? Reste-t-il à +0 toute l'année?
mpen
1
@Mark Je ne suis pas sûr, les docs disent que lorsque time_zone="+00:00"vous définissez, vous définissez le fuseau horaire en utilisant un décalage par rapport à l'UTC, étant donné que la valeur définie ne change jamais et que l'UTC ne suit pas l'heure d'été, je peux supposer qu'elle reste la même toute l'année.
Timo Huovinen
1
@TimoHuovinen Désolé, je voulais dire que cela +00:00 ressemble à un décalage, donc c'est assez étrange que MySQL ait choisi cela pour représenter UTC au lieu d'utiliser simplement la chaîne "UTC" elle-même. Merci pour l'info.
mpen
1
J'ai mis +00: 00, mais j'obtiens cette erreur: erreur: option trouvée sans groupe précédent dans le fichier de configuration: /etc/my.cnf
János
5
dans Win7, le chemin vers le fichier de paramètres mysql estC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
84

Pour toute personne ayant toujours ce problème:

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

A travaillé pour moi. Ajoutez juste ?serverTimezone=UTCà la fin.

Noel Murphy
la source
Si mon fuseau horaire est UTC + 7, comment pourrais-je le spécifier dans la chaîne de connexion? J'ai essayé d'ajouter "? ServerTimezone = UTC + 7" et cela ne fonctionne pas.
Chiến Nghê
1
La question ne concernait pas JDBC, mais MySQL lui-même.
Luiz
2
@ ChiếnNghê: Vous devriez utiliser Asia/Ho_Chi_Minhau lieu de UTCBTW, la question est de changer le fuseau horaire de MySQL. Veuillez donc consulter la réponse @Timo. Si vous rencontrez des problèmes avec le docker MySQL, ajoutez l'environnement TZ et cela devrait fonctionner.
Liem Le
2
Cela n'informe que JDBC du fuseau horaire du serveur, il ne le modifie pas. Pour définir le fuseau horaire de la session, vérifiez les réponses qui utilisentSET time_zone=...
Nikola Mihajlović
J'obtenais une erreur CDT, mais cela l'a corrigé pour moi.
Akexis
58

Lorsque vous pouvez configurer le serveur de fuseau horaire pour MySQL ou PHP:

Rappelles toi:

  1. Changer le système de fuseau horaire. 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
Jeanne
la source
2
Peut-être que cette approche n'est peut-être pas la bonne. Pensez à la situation d'avoir un serveur avec UTC mais votre application sert des données à un pays sur UTC -0600. Pour ajuster le fuseau horaire pour MySQL, pourrait être beaucoup mieux.
ivanleoncz
1
Surtout si vous travaillez dans une zone qui couvre plusieurs fuseaux horaires.
Alexis Wilke
57

Pour le définir pour la session en cours, procédez comme suit:

SET time_zone = timezonename;
James Skidmore
la source
14
SELECT @@ session.time_zone;
James Skidmore
1
J'essaie de corriger certaines erreurs sur mon système, et je dois définir mon time_zone sur UTC, pas sur GMT. Savez-vous que si je mets à «-0: 00» ou «+00: 00», il s'agit d'une annotation UTC ou GMT? Je ne trouve pas cette information spécifique. À votre santé!
rafa.ferreira
@ Castanho, je suis sûr que l'un ou l'autre fonctionnera bien. Découvrez l'explication sur cette question: stackoverflow.com/questions/3466630/…
James Skidmore
La valeur du fuseau horaire peut être la même que celle définie en PHP, comme SET time_zone = 'America/Boise'. Merci pour la réponse, James Skidmore!
Adam F
1
@the_nuts oui, le SET time_zone = 'UTC';paramètre est perdu lors du redémarrage du serveur
Timo Huovinen
48

Exécutez simplement ceci sur votre serveur MySQL:

SET GLOBAL time_zone = '+8:00';

Où +8: 00 sera votre fuseau horaire.

Rico Chan
la source
14
Notez que cela n'est que temporaire jusqu'à ce que vous redémarriez Mysql
rubo77
On a rarement des privilèges de superutilisateur lors de la connexion à une base de données. Un réglage @@session.time_zonetel que décrit dans d'autres réponses est une bien meilleure solution.
colm.anseo
16

Cela fonctionne pour moi pour un emplacement en Inde:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
la source
vous devez l'exécuter en tant que requête sur mysql ou écrire sous my.conf avec la syntaxe suivante default-time-zone = '+05: 30'
Swapnil Bijwe
11

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 en particulier l' --default-time-zone=timezoneoption. Vous pouvez vérifier les fuseaux horaires globaux et de session avec

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

définissez l'un ou les deux avec l' SETinstruction, & c; voir http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html pour plus de détails.

Alex Martelli
la source
11

Gardez à l'esprit que 'Country / Zone' ne fonctionne pas parfois ... Ce problème n'est pas lié au système d'exploitation, à la version de MySQL et au matériel - je l'ai rencontré depuis FreeBSD 4 et Slackware Linux en 2003 jusqu'à aujourd'hui. MySQL depuis la version 3 jusqu'au dernier tronc source. C'est ODD, mais cela arrive. 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»

Jetez un œil au sous-dossier de votre répertoire d'informations de zone et voyez le nom de fichier ACTUEL pour le lien symbolique, dans ce cas, il s'agit de EST5EDT. Essayez ensuite cette instruction:

SET time_zone='EST5EDT';

Et cela fonctionne comme prévu! :) Gardez cette astuce à l'esprit; Je ne l'ai pas vu être documenté dans les manuels MySQL et la documentation officielle. Mais lire la documentation correspondante est une chose incontournable: la documentation officielle du fuseau horaire MySQL 5.5 - et n'oubliez pas de charger les données du fuseau horaire sur votre serveur comme ça (exécutez en tant qu'utilisateur root!):

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

Astuce numéro un - cela doit être fait exactement sous l'utilisateur root MySQL. Il peut échouer ou produire un résultat non fonctionnel, même de l'utilisateur qui a un accès complet à une base de données MySQL - j'ai moi-même vu le problème.

Alexey Vesnin
la source
Veuillez me dire que votre nom -a et d'autres détails - ont des cas de travail sur le bureau et le serveur Ubuntu.
Alexey Vesnin
7

C'est une question vieille de 10 ans, mais de toute façon voici ce qui a fonctionné pour moi. J'utilise MySQL 8.0 avec Hibernate 5 et SpringBoot 4.

J'ai essayé la réponse acceptée ci-dessus mais je n'ai pas fonctionné pour moi, ce qui a fonctionné pour moi est le suivant:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

Si cela vous aide, n'oubliez pas de voter positivement: D

sabre hamza
la source
4

Question ancienne avec une autre suggestion:

Si vous avez récemment modifié le fuseau horaire du système d'exploitation, par exemple via:

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

... MySQL (ou MariaDB) ne remarquera rien tant que vous n'aurez pas redémarré le service db:

service mysqld restart

(ou)

service mariadb restart
inanutshellus
la source
3

Si vous utilisez MySql Workbench, vous pouvez le configurer en ouvrant la vue administrateur et en sélectionnant l'onglet Avancé. La section supérieure est "Localisation" et la première case à cocher doit être "fuseau horaire par défaut". Cochez cette case, puis entrez votre fuseau horaire souhaité, redémarrez le serveur et vous devriez être prêt à partir.

Taylor Lafrinere
la source
2
Le problème est lié à MySQL, pas à un programme particulier.
fedorqui 'SO arrête de nuire'
3
Je n'ai rien trouvé de tel.
Kzqai
1
Rien de tel
Green
Pour MySQL Workbench 6.3: Instance => Fichier d'options => Général => International
paulus
5
[ MISE À JOUR pour MySQL Workbench 8.0 ] Sélectionnez "Serveur" => "Fichier d'options", et sur l' onglet "Général" voir ci-dessous la section "International" . Il y aura une case à cocher "fuseau horaire par défaut" avec le champ associé. Vous pouvez donc y définir la valeur de fuseau horaire par défaut .
informatik01
3

Tout d'abord pour savoir quelle est la zone temporelle, vous pouvez interroger

SHOW VARIABLES LIKE '%time_zone%'; 

Votre sortie devrait être quelque chose de similaire comme suit

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

Ensuite, si vous voulez confirmer que vous vous trouvez dans un fuseau horaire comme CDT au lieu de quelque chose comme EST, vous pouvez vérifier l'heure à laquelle il pense que votre machine se trouve en disant

SELECT NOW();

Si ce n'est pas le moment que vous voulez, vous devez le changer ... tout ce que vous devez faire est SET time_zone = timezone_name. Assurez-vous que celui-ci est au Continent/Cityformat.

Si vous êtes sur un serveur partagé parce que vous avez un service d'hébergement, veuillez vous référer à ces réponses concernant la modification du fichier php.ini ou du fichier .htaccess.

Erik Toor
la source
1
J'ai essayé d' mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eabord, puis j'ai SET time_zone = timezone_namebien fonctionné.
Barakat Turki
1

Vous devez configurer le fuseau horaire de votre emplacement. Pour suivre le processus ci-dessous
Ouvrez votre MSQLWorkbench, écrivez une simple commande sql comme celle-ci;

select now();

Et aussi votre URL pourrait être comme ça;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
la source
@LuFFy, c'est ce que je me demandais, donc pour chaque db-connect le fuseau horaire doit être défini SI nous utilisons le fuseau horaire de portée de session et non le fuseau horaire de portée «globale». Il est bon d'utiliser la portée de la session si l'application peut avoir des utilisateurs dans différents fuseaux horaires, non?
Valter Ekholm
1

Pour définir le fuseau horaire standard à MariaDB, vous devez aller dans le fichier 50-server.cnf .

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

Ensuite, vous pouvez entrer l'entrée suivante dans la section mysqld.

default-time-zone='+01:00'

Exemple:

#
# 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.

La modification doit être effectuée via le fichier de configuration, sinon le serveur MariaDB réinitialisera les tables mysql après un redémarrage!

Lukas Kuntze
la source
1

Editez le fichier de configuration MySQL

sudo nano /etc/mysql/my.cnf

Faites défiler et ajoutez-les au bas. Changer de fuseau horaire pertinent

[mysqld]
default-time-zone = "+00:00"

Redémarrez le serveur

sudo service mysql restart
Ivan_ug
la source
0

Sous Windows (IIS) afin de pouvoir SET GLOBAL time_zone = 'Europe / Helsinki' (ou autre), les tables de description de MySQL time_zone doivent être remplies en premier.

Je les ai téléchargés à partir de ce lien https://dev.mysql.com/downloads/timezones.html

Après avoir exécuté la requête SQL téléchargée, j'ai pu définir la zone_horaire mondiale et résoudre le problème que j'ai rencontré avec SELECT NOW (); renvoyait GMT plutôt que BST.

Stewart Kirkpatrick
la source
Je pouvais utiliser le format numérique "+01: 00" au lieu de "Europe / Stockholm" donc je n'avais pas besoin de télécharger les tableaux de description de time_zone, je pense.
Valter Ekholm
0

Dans mon cas, la solution était de définir le paramètre serverTimezone dans les paramètres avancés sur une valeur appropriée (CET pour mon fuseau horaire).

Comme j'utilise IntelliJ, j'utilise son module de base de données. Lors de l'ajout d'une nouvelle connexion à la base de données et après l'ajout de tous les paramètres pertinents dans l'onglet Général, une erreur s'est produite sur le bouton "Tester la connexion". Encore une fois, la solution consiste à définir le paramètre serverTimezone dans l'onglet Avancé.

ognjenkl
la source
0

Si quelqu'un utilise GoDaddy Shared Hosting, vous pouvez essayer la solution suivante, qui a fonctionné pour moi.

Lors du démarrage de la connexion DB, définissez la commande time_zone dans mon objet PDO, par exemple:

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

Où "+05: 30" est la zone horaire de l'Inde. Vous pouvez le changer selon vos besoins.

Après ça; tous les processus MySQL liés à la date et à l'heure sont définis avec le fuseau horaire requis.

Source: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Ashish Pandey
la source