Question de suivi de /server/191331/should-servers-have-their-timezone-set-to-gmt-utc
Le fuseau horaire MySQL doit-il être défini sur UTC ou doit-il être défini sur le même fuseau horaire que le serveur ou PHP est défini? (Si ce n'est pas UTC)
Quels sont les avantages et inconvénients?
Réponses:
Il semble que le fuseau horaire du serveur n'a pas d'importance tant que vous avez l'heure correctement définie pour le fuseau horaire actuel, que vous connaissez le fuseau horaire des colonnes datetime que vous stockez et que vous êtes conscient des problèmes liés à l'heure d'été.
D'un autre côté, si vous contrôlez les fuseaux horaires des serveurs avec lesquels vous travaillez, vous pouvez tout régler sur UTC en interne et ne jamais vous soucier des fuseaux horaires et de l'heure d'été.
Voici quelques notes que j'ai collectées sur la façon de travailler avec les fuseaux horaires comme une forme de feuille de triche pour moi et pour les autres, ce qui pourrait influencer le fuseau horaire que la personne choisira pour son serveur et comment elle stockera la date et l'heure.
Aide-mémoire du fuseau horaire MySQL
Remarques:
GMT confond les secondes, c'est pourquoi UTC a été inventé.
Avertissement! différents fuseaux horaires régionaux peuvent produire la même valeur datetime en raison de l'heure d'été
En interne, une colonne d'horodatage MySQL est stockée au format UTC, mais lors de la sélection d'une date, MySQL la convertira automatiquement dans le fuseau horaire de la session actuelle.
Lors du stockage d'une date dans un horodatage, MySQL supposera que la date est dans le fuseau horaire de la session actuelle et la convertira en UTC pour le stockage.
Pour sélectionner une colonne d'horodatage au format UTC
quel que soit le fuseau horaire dans lequel se trouve la session MySQL actuelle:
Vous pouvez également définir le fuseau horaire du serveur ou de la session globale ou actuelle sur UTC, puis sélectionner l'horodatage comme suit:
Pour sélectionner la date / heure actuelle en UTC:
Exemple de résultat:
2015-03-24 17:02:41
Pour sélectionner la date / heure actuelle dans le fuseau horaire de la session
Pour sélectionner le fuseau horaire qui a été défini lors du lancement du serveur
Renvoie "MSK" ou "+04: 00" pour l'heure de Moscou, par exemple, il y a (ou était) un bogue MySQL où s'il était défini sur un décalage numérique, il n'ajusterait pas l'heure d'été
Pour obtenir le fuseau horaire actuel
Il retournera 02:00:00 si votre fuseau horaire est +2: 00.
Pour obtenir l'horodatage UNIX actuel (en secondes):
Pour obtenir la colonne d'horodatage sous forme d'horodatage UNIX
Pour obtenir une colonne de date et heure UTC comme horodatage UNIX
Obtenir une date / heure de fuseau horaire actuel à partir d'un entier d'horodatage UNIX positif
Obtenir une date UTC à partir d'un horodatage UNIX
Obtenir une date / heure de fuseau horaire actuel à partir d'un entier d'horodatage UNIX négatif
Il y a 3 endroits où le fuseau horaire peut être défini dans MySQL:
Remarque: un fuseau horaire peut être défini dans 2 formats:
dans le fichier "my.cnf"
ou
@@ variable global.time_zone
Pour voir à quelle valeur ils sont définis
Pour définir une valeur, utilisez l'un ou l'autre:
@@ session.time_zone, variable
Pour le définir, utilisez l'un ou l'autre:
"@@ global.time_zone variable" et "@@ session.time_zone variable" 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 (même pour le fuseau horaire par défaut), vous devez configurer vos tables d'informations de fuseau horaire qui doivent être remplies: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support. html
Remarque: vous ne pouvez pas faire cela car cela renverra NULL:
Configurer les tables de fuseaux horaires MySQL
Pour
CONVERT_TZ
fonctionner, vous avez besoin que les tables de fuseaux horaires soient rempliesS'ils sont vides, remplissez-les en exécutant cette commande
si cette commande vous donne l'erreur " données trop longues pour la colonne 'abréviation' à la ligne 1 ", cela peut être dû à l'ajout d'un caractère NULL à la fin de l'abréviation du fuseau horaire
le correctif étant d'exécuter ceci
(assurez-vous que les règles dst de vos serveurs sont à jour
zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )Voir l'historique complet des transitions DST (Daylight Saving Time) pour chaque fuseau horaire
CONVERT_TZ
applique également toutes les modifications DST nécessaires en fonction des règles des tableaux ci-dessus et de la date que vous utilisez.Remarque:
selon la documentation , la valeur que vous définissez pour time_zone ne change pas, si vous la définissez comme "+01: 00" par exemple, alors la zone time_zone sera définie comme un décalage par rapport à UTC, qui ne suit pas l'heure d'été, donc il restera le même toute l'année.
Seuls les fuseaux horaires nommés changeront d'heure pendant l'heure d'été.
Les abréviations comme
CET
seront toujours une heure d'hiver etCEST
seront l'heure d'été tandis que +01: 00 sera toujoursUTC
heure + 1 heure et les deux ne changeront pas avec l'heure d'été.Le
system
fuseau horaire sera le fuseau horaire de la machine hôte où mysql est installé (sauf si mysql ne parvient pas à le déterminer)Vous pouvez en savoir plus sur l'utilisation de l'heure d'été ici
questions connexes:
Sources:
la source
table
setmodified
= '2016-07-07 08:10 +00: 00'UNIX_TIMESTAMP(NOW());
ainsi que toutes vos utilisationsCONVERT_TZ()
où l'un des paramètres est `@@ session.time_zone. Pour convertir de manière fiable les heures de données UTC en horodatages UNIX, vous devez d'abord définir la zone time_zone de la session.Voici un exemple de travail:
la source
PHP et MySQL ont leurs propres configurations de fuseau horaire par défaut. Vous devez synchroniser l'heure entre votre base de données et votre application Web, sinon vous pourriez rencontrer des problèmes.
Lisez ce tutoriel: Comment synchroniser vos fuseaux horaires PHP et MySQL
la source
date_default_timezone_set("America/Los_Angeles");
et amysql_query("SET time_zone='" . date('P', time()) . "'");
travaillé très élégamment!Les avantages et les inconvénients sont à peu près identiques, cela dépend si vous le souhaitez ou non.
Attention, si le fuseau horaire de MySQL diffère de l'heure de votre système (par exemple PHP), comparer l'heure ou l'impression à l'utilisateur impliquera un peu de bricolage.
la source