web-dev-qa-db-fra.com

Fuseaux horaires MySQL

Existe-t-il une liste exhaustive des fuseaux horaires MySQL?

Il semble que les valeurs valides pour time_zone dans les paramètres MySQL dépendent du système d'exploitation hôte, mais je n'ai pas trouvé de liste de valeurs possibles.

J'ai besoin de temps pour montrer l'heure locale de Calgary.

18
Gary

De la documentation de MySQL 5.7 (l'emphase mienne):

les valeurs de fuseau horaire peuvent être données dans plusieurs formats, dont aucun n'est sensible aux majuscules et minuscules:

La valeur 'SYSTEM' indique que le fuseau horaire doit être identique à le fuseau horaire du système.

La valeur peut être donnée sous forme de chaîne indiquant un décalage par rapport à UTC, tel que comme '+10: 00' ou '-6: 00'.

La valeur peut être donnée en tant que fuseau horaire nommé, tel que «Europe/Helsinki», «US/Eastern» ou «MET». Les fuseaux horaires nommés ne peuvent être utilisés Que si les tables d'informations sur les fuseaux horaires de la base de données mysql Ont été créées et remplies.

Il est à noter que le paramètre par défaut de la variable MySQL timezone est SYSTEM au démarrage de MySQL. La valeur SYSTEM est obtenue à partir d'un paramètre du système d'exploitation (par exemple, à partir du fichier référencé par le lien symbolique /etc/localtime).

La variable timezone par défaut de MySQL peut être initialisée avec une valeur différente au démarrage en fournissant l'option de ligne de commande suivante:

--default-time-zone=timezone

Si vous fournissez la valeur dans un fichier d'options, vous pouvez également utiliser la syntaxe suivante pour définir la variable:

--default-time-zone='timezone'

Si vous êtes un utilisateur MySQL SUPER, vous pouvez définir la variable SYSTEM time_zone lors de l'exécution à partir de MYSQL> Invite à l'aide de la syntaxe suivante:

SET GLOBAL time_zone=timezone;

MySQL prend également en charge les valeurs individuelles de SESSION timezone qui prennent par défaut la valeur de variable d’environnement GLOBAL time_zone. Pour modifier la valeur de la session timezone au cours d'une SESSION, utilisez la syntaxe suivante:

SET time_zone=timezone;

Pour interroger les valeurs de paramètre MYSQL timezone existantes, vous pouvez exécuter le code SQL suivant pour obtenir ces valeurs:

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

Pour ce que cela vaut, j’ai simplement cherché Google {valeurs valides de la configuration de mysql time_zone} _ et j’ai examiné le premier résultat.

18
Brian Driscoll

Par défaut, (du moins sur les installations basées sur Debian), aucune donnée de fuseau horaire n'est chargée dans MySQL. Si vous voulez tester s'ils sont chargés, essayez d'exécuter:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Si elle renvoie une DATETIME (dans ce cas, 2012-06-07 08:00:00), vous avez des fuseaux horaires chargés. Si elle retourne NULL, ils ne le sont pas. Lorsque vous n'êtes pas chargé, vous êtes limité à la conversion à l'aide de décalages (par exemple, +10:00 ou -6:00).

Cela devrait bien fonctionner dans de nombreux cas, mais il est parfois préférable d'utiliser des fuseaux horaires nommés, par exemple pour ne pas s'inquiéter de l'heure d'été. L'exécution de la commande suivante charge les données de fuseau horaire à partir du système (Unix uniquement. Je ne sais pas ce que la commande Windows équivalente serait):

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

Si vous devez vous appuyer constamment sur les fuseaux horaires MySQL, vous devez exécuter la commande ci-dessus à chaque mise à jour du fuseau horaire du système. Vous pouvez également simplement l'ajouter à un travail hebdomadaire ou mensuel cron pour le faire automatiquement.

Ensuite, pour afficher une liste de fuseaux horaires, procédez comme suit:

USE mysql;
SELECT * FROM `time_zone_name`;

Notez que les informations de fuseau horaire occupent environ 5 Mo sous MySQL. Si vous souhaitez un jour décharger les informations du fuseau horaire, exécutez ce qui suit et redémarrez MySQL:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

Ne pas DROP ces tables sinon de mauvaises choses vont arriver.


Modifier:

Selon le commentaire d'utilisateur ci-dessous, si vous souhaitez que les fuseaux horaires soient automatiquement mis à jour lorsque vous mettez à jour le système, vous devez d'abord autoriser root à se connecter sans qu'un mot de passe ne soit demandé.

MySQL> = 5.6.6

Exécutez le [ source ] suivant:

mysql_config_editor set --login-path=client --Host=localhost --user=root --password

MySQL <5.6.6

Créez un fichier ~/.my.cnf (s'il n'existe pas encore) et ajoutez ce qui suit:

[client]
user=root
password=yourMysqlRootPW

Exécutez ensuite chmod 600 ~/.my.cnf pour vous assurer que personne d'autre ne peut le lire.

Script de mise à jour

Ajoutez le script suivant à crontab à exécuter une fois par jour:

#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24   
# hours and do not have ".tab" in the name (since these are not timezone files) 
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo "Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo "Done!\n"
fi

Supprimez les lignes echo si vous ne voulez aucune sortie.

Remarque: Ceci est (la plupart du temps) non testé. Faites-moi savoir si vous avez des problèmes et je met à jour cette réponse.

42
Mike

Je suis allé de l'avant et créé un Gist.

https://Gist.github.com/4134305

https://Gist.github.com/kinjal/9105369

J'espère que les gens le trouveront utile.

5
Kinjal Dixit

Une liste exhaustive des fuseaux horaires peut être téléchargée depuis le site Web de MySQL sous forme de tables de base de données importées dans le serveur MySQL.

Pour l’heure de Calgary, vous pouvez spécifier les décalages UTC comme suit: 

set time_zone = '-6:00';
3
sikander

Il convient de noter que le paramètre par défaut de la variable de fuseau horaire MySQL est SYSTEM au démarrage de MySQL. La valeur SYSTEM est obtenue à partir de la variable d'environnement GLOBAL time_zone du système d'exploitation.

La variable de fuseau horaire par défaut de MySQL peut être initialisée avec une valeur différente au démarrage en fournissant l'option de ligne de commande suivante:

--default-time-zone=timezone

Si vous fournissez la valeur dans un fichier d'options, vous pouvez également utiliser la syntaxe suivante pour définir la variable:

--default-time-zone='timezone'

Si vous êtes un utilisateur MySQL SUPER, vous pouvez définir la variable SYSTEM time_zone à l'exécution à partir de MYSQL> Invite à l'aide de la syntaxe suivante:

SET GLOBAL time_zone=timezone;

MySQL prend également en charge les valeurs de fuseau horaire SESSION individuelles, qui prennent par défaut la valeur de la variable d’environnement GLOBAL time_zone. Pour modifier la valeur du fuseau horaire de la session pendant une session, utilisez la syntaxe suivante:

SET time_zone=timezone;

Pour interroger les valeurs de paramètre de fuseau horaire MYSQL existantes, vous pouvez exécuter le code SQL suivant pour obtenir ces valeurs:

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