Recherche…


Remarques

Lorsque vous devez gérer les informations de temps pour une base d'utilisateurs mondiale dans MySQL, utilisez le type de données TIMESTAMP dans vos tables.

Pour chaque utilisateur, stockez une colonne de fuseau horaire de préférence utilisateur. VARCHAR (64) est un bon type de données pour cette colonne. Lorsqu'un utilisateur s'inscrit pour utiliser votre système, demandez la valeur du fuseau horaire. Le mien est Atlantic Time, America/Edmonton . Vous pourriez ou non être en Asia/Kolkata ou en Australia/NSW . Pour une interface utilisateur pour ce paramètre de préférence utilisateur, le logiciel WordPress.org a un bon exemple.

Enfin, chaque fois que vous établissez une connexion depuis votre programme hôte (Java, php, etc.) vers votre SGBD au nom d’un utilisateur, émettez la commande SQL.

 SET SESSION time_zone='(whatever tz string the user gave you)'

avant de manipuler des données d'utilisateur impliquant des temps. Ensuite, tous les temps TIMESTAMP vous avez installés seront affichés à l'heure locale de l'utilisateur.

Cela entraînera la conversion de tous les temps dans vos tables en UTC et la conversion de toutes les heures en données locales. Cela fonctionne correctement pour NOW () et CURDATE (). Encore une fois, vous devez utiliser TIMESTAMP et pas les types de données DATETIME ou DATE pour cela.

Assurez-vous que le système d'exploitation de votre serveur et les fuseaux horaires par défaut de MySQL sont définis sur UTC. Si vous ne le faites pas avant de charger des informations dans votre base de données, il sera presque impossible de les corriger. Si vous utilisez un fournisseur pour exécuter MySQL, insistez pour que ce soit le cas.

Récupérez la date et l'heure actuelles dans un fuseau horaire particulier.

Cela récupère la valeur de NOW() en heure locale, en heure standard en Inde, puis à nouveau en UTC.

SELECT NOW();
SET time_zone='Asia/Kolkata'; 
SELECT NOW();
SET time_zone='UTC'; 
SELECT NOW();

Convertir une valeur stockée `DATE` ou` DATETIME` dans un autre fuseau horaire.

Si vous avez un DATE ou DATETIME stocké (dans une colonne quelque part), il a été stocké par rapport à un fuseau horaire, mais en MySQL, le fuseau horaire n'est pas stocké avec la valeur. Donc, si vous voulez le convertir en un autre fuseau horaire, vous pouvez le faire, mais vous devez connaître le fuseau horaire d'origine. Utiliser CONVERT_TZ() effectue la conversion. Cet exemple montre les lignes vendues en Californie à l'heure locale.

SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
  FROM sales
 WHERE state_sold = 'CA'

Récupère les valeurs stockées de TIMESTAMP dans un fuseau horaire particulier

C'est vraiment facile. Toutes les valeurs TIMESTAMP sont stockées dans le temps universel et sont toujours converties au paramètre time_zone actuel à chaque rendu.

SET SESSION time_zone='America/Los_Angeles'; 
SELECT timestamp_sold
  FROM sales
 WHERE state_sold = 'CA'

Pourquoi est-ce? TIMESTAMP valeurs TIMESTAMP sont basées sur le type de données vénérable UNIX time_t . Ces horodatages UNIX sont stockés sous forme de nombre de secondes depuis le 1970-01-01 00:00:00 UTC.

Remarquez que les valeurs TIMESTAMP sont stockées dans le temps universel. DATE valeurs DATE et DATETIME sont stockées quelle que soit l'heure locale au moment de leur stockage.

Quel est le paramètre de fuseau horaire local de mon serveur?

Chaque serveur a un paramètre global time_zone par défaut, configuré par le propriétaire de la machine serveur. Vous pouvez trouver le réglage actuel du fuseau horaire de cette manière:

SELECT @@time_zone

Malheureusement, cela donne généralement la valeur SYSTEM , ce qui signifie que le temps MySQL est régi par le paramètre de fuseau horaire du système d'exploitation du serveur.

Cette séquence de requêtes (oui, c'est un hack ) vous redonne le décalage en minutes entre le paramètre de fuseau horaire du serveur et UTC.

CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;

Comment cela marche-t-il? Les deux colonnes de la table temporaire avec différents types de données constituent l'indice. Les types de données DATETIME sont toujours stockés dans l'heure locale dans les tables et les TIMESTAMP dans l'UTC. Ainsi, l'instruction INSERT , exécutée lorsque le paramètre time_zone est défini sur UTC, stocke deux valeurs de date / heure identiques.

Ensuite, l'instruction SELECT est effectuée lorsque time_zone est défini sur l'heure locale du serveur. TIMESTAMP s sont toujours traduits de leur forme UTC stockée en heure locale dans les instructions SELECT. DATETIME ne sont pas. Ainsi, l'opération TIMESTAMPDIFF(MINUTE...) calcule la différence entre l'heure locale et l'heure universelle.

Quelles valeurs time_zone sont disponibles sur mon serveur?

Pour obtenir une liste des valeurs time_zone possibles dans votre instance de serveur MySQL, utilisez cette commande.

 SELECT mysql.time_zone_name.name

Normalement, cela montre la liste ZoneInfo des fuseaux horaires maintenue par Paul Eggert à la Internet Assigned Numbers Authority . Dans le monde entier, il y a environ 600 fuseaux horaires.

Les systèmes d'exploitation de type Unix (distributions Linux, distributions BSD et distributions Mac OS modernes, par exemple) reçoivent des mises à jour de routine. L'installation de ces mises à jour sur un système d'exploitation permet aux instances MySQL en cours d'exécution de suivre les changements de fuseau horaire et les changements d'heure d'été / heure standard.

Si vous obtenez une liste beaucoup plus courte de noms de fuseaux horaires, votre serveur est soit mal configuré, soit exécuté sous Windows. Voici les instructions pour votre administrateur de serveur pour installer et maintenir la liste ZoneInfo.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow