web-dev-qa-db-fra.com

Comment définir le fuseau horaire de MySQL?

Sur un serveur, quand 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)
284
omg

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

Le fuseau horaire peut être défini dans MySQL à trois endroits:

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

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

@@ global.time_zone variable

Pour voir quelle valeur ils sont mis à:

SELECT @@global.time_zone;

Pour définir une valeur, utilisez l’un des deux suivants:

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 tels que "Europe/Helsinki" signifie que vous devez avoir une table de fuseau horaire correctement remplie.)

Gardez à l'esprit que +02:00 est un décalage. Europe/Berlin est un fuseau horaire (qui a deux décalages) et CEST est une heure correspondant à un décalage spécifique.

@@ variable_session.time_zone

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 renvoyer 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 tables d’information de fuseau horaire: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Je mentionne également comment remplir ces tables dans cette réponse .

Pour obtenir le décalage de fuseau horaire actuel sous la forme TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

Pour obtenir le timestamp UNIX actuel:

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

Pour obtenir la colonne d'horodatage sous la forme d'un horodatage UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Pour obtenir une colonne datetime UTC sous la forme d'un horodatage UNIX

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

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

J'ai fait une feuille de triche ici: Le fuseau horaire de MySQL doit-il être défini sur UTC?

459
Timo Huovinen

Pour ceux qui ont encore ce problème:

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

Travaillé pour moi Il suffit d’ajouter ?serverTimezone=UTC à la fin.

54
Noel Murphy

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

SET time_zone = timezonename;
53
James Skidmore

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
    
50
jane

Exécutez-le simplement sur votre serveur MySQL:

SET GLOBAL time_zone = '+8:00';

Où +8: 00 sera votre fuseau horaire.

39
Rico Chan

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";
14
Swapnil Bijwe

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/fr/server-options.html et plus précisément le --default-time-zone=timezone option. 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 à l'aide de l'instruction SET, & c; Voir http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html pour plus de détails.

10
Alex Martelli

Gardez à l'esprit que 'Pays/Zone' ne fonctionne pas parfois ... Ce problème ne dépend pas du système d'exploitation, de la version de MySQL ni du matériel - je le connais depuis FreeBSD 4 et Slackware Linux de 2003 à aujourd'hui. MySQL de la version 3 au dernier tronc source. C'est ODD, mais ça 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 telle déclaration est supposée fonctionner:

SET time_zone='US/Eastern';

Mais vous avez ce problème:

Code d'erreur: 1298. Fuseau horaire inconnu ou incorrect: 'EUS/Eastern'

Examinez le sous-dossier de votre répertoire d'informations de zone et voyez le nom de fichier ACTUAL pour le lien symbolique, dans le cas présent, il s'agit de EST5EDT. Puis essayez plutôt cette déclaration:

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 à ne pas manquer: documentation officielle de MySQL 5.5: timezone - et n'oubliez pas de charger les données de fuseau horaire sur votre serveur, comme cela (exécuté 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 des résultats inutilisables, même de la part d’un utilisateur ayant un accès complet à une base de données MySQL - j’ai moi-même constaté le problème.

9
Alexey Vesnin

Si vous utilisez PDO:

$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");

Si vous utilisez MySQLi:

$db->MySQLi->query("SET time_zone='".$offset."';");

Plus d'informations sur le formatage de l'offset ici: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

6
MeKoo Solutions

Ancienne question 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 le remarquera pas avant le redémarrage du service de base de données:

service mysqld restart

(ou)

service mariadb restart
4
inanutshellus

Pour définir le fuseau horaire standard à MariaDB, vous devez accéder au 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!

1
Lukas Kuntze

Si vous utilisez MySql Workbench, vous pouvez le définir 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 "default-time-zone". Cochez cette case, puis entrez le fuseau horaire de votre choix, redémarrez le serveur et vous devriez être prêt à partir.

1
Taylor Lafrinere

D'abord pour comprendre quelle est la zone de temps que 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 êtes dans un fuseau horaire tel que CDT au lieu de quelque chose comme EST, vous pouvez vérifier l’heure à laquelle 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 avez à faire est de SET time_zone = timezone_name. Assurez-vous qu'il s'agit du format Continent/City.

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.

1
Erik Toor

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

J'ai téléchargé ces derniers à 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 le time_zone GLOBAL et résoudre le problème que j'avais où SELECT NOW (); retournait GMT plutôt que BST.

0
Stewart Kirkpatrick