279 votes

Comment puis-je obtenir le fuseau horaire actuel de MySQL ?

Quelqu'un sait-il s'il existe une telle fonction dans MySQL ?

UPDATE

Cela ne donne aucune information valable :

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Ou peut-être que MySQL lui-même ne peut pas connaître exactement la time_zone utilisé, c'est bien, nous pouvons impliquer PHP ici, tant que je peux obtenir des informations valables, pas comme SYSTEM ...

4 votes

"Nous pouvons faire intervenir PHP ici" - et cette instance de php serait-elle toujours sur la même machine que le serveur MySQL ?

0 votes

Oui, ils seront sur la même machine.

17 votes

Essayez @@system_time_zone comme indiqué dans ma réponse ci-dessous.

286voto

T.J. Crowder Points 285826

A partir du manuel ( section 9.6 ):

Les valeurs actuelles des fuseaux horaires globaux et spécifiques au client peuvent être récupérées comme suit :
mysql> SELECT @@global.time_zone, @@session.time_zone;

Modifier Les résultats ci-dessus SYSTEM si MySQL est configuré pour utiliser le fuseau horaire du système, ce qui est loin d'être utile. Puisque vous utilisez PHP, si la réponse de MySQL est SYSTEM vous pouvez alors demander au système quel fuseau horaire c'est par l'intermédiaire de date_default_timezone_get . (Bien sûr, comme VolkerK l'a souligné, PHP peut être exécuté sur un autre serveur, mais en supposant que le serveur web et le serveur de base de données auxquels il communique sont des serveurs de type "web", il est possible de faire des suppositions. réglé sur [si ce n'est pas le cas sur Le fait d'être dans le même fuseau horaire n'est pas énorme saut.) Mais attention, (comme avec MySQL), vous pouvez définir le fuseau horaire utilisé par PHP ( date_default_timezone_set ), ce qui signifie qu'il peut rapporter une valeur différente de celle utilisée par le système d'exploitation. Si vous contrôlez le code PHP, vous devriez savoir si vous faites cela et vous en sortir.

Mais la question du fuseau horaire utilisé par le serveur MySQL peut être une tangente, car demander au serveur quel est le fuseau horaire dans lequel il se trouve vous permet d'obtenir les informations suivantes absolument rien sur les données de la base de données. Lisez la suite pour en savoir plus :

Poursuite de la discussion :

Si vous avez le contrôle du serveur, vous pouvez bien sûr vous assurer que le fuseau horaire est connu. Si vous n'avez pas le contrôle du serveur, vous pouvez définir le fuseau horaire utilisé par votre serveur. connexion comme ça :

set time_zone = '+00:00';

Cela définit le fuseau horaire à GMT, de sorte que toutes les autres opérations (telles que now() ) utilisera l'heure GMT.

Notez cependant que les valeurs d'heure et de date sont no stocké avec des informations sur le fuseau horaire dans MySQL :

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

La connaissance du fuseau horaire du serveur n'est donc importante que pour les fonctions qui obtiennent l'heure actuelle, telles que now() , unix_timestamp() etc. ; il ne vous dit rien sur le fuseau horaire utilisé par les dates de la base de données. Vous pouvez choisir de supposez ils ont été écrits en utilisant le fuseau horaire du serveur, mais cette hypothèse peut être erronée. Pour connaître le fuseau horaire de toutes les dates ou heures stockées dans les données, vous devez vous assurer qu'elles sont stockées avec des informations sur le fuseau horaire ou (comme je le fais) vous assurer qu'elles sont toujours en GMT.

Pourquoi l'hypothèse que les données ont été écrites en utilisant le fuseau horaire du serveur est-elle erronée ? Eh bien, d'une part, les données peuvent avoir été écrites en utilisant une connexion qui définit un fuseau horaire différent. La base de données peut avoir été déplacée d'un serveur à un autre, où les serveurs se trouvaient dans des fuseaux horaires différents (j'ai rencontré ce problème lorsque j'ai hérité d'une base de données qui avait été déplacée du Texas à la Californie). Mais même si les données sont écrites sur le serveur, avec son fuseau horaire actuel, c'est toujours ambigu. L'année dernière, aux États-Unis, l'heure d'été a été supprimée le 1er novembre à 2 heures du matin. Supposons que mon serveur se trouve en Californie et utilise le fuseau horaire du Pacifique, et que j'ai la valeur 2009-11-01 01:30:00 dans la base de données. Quand était-ce ? Était-ce 1 h 30 du matin le 1er novembre PDT, ou 1 h 30 du matin le 1er novembre PST (une heure plus tard) ? Vous n'avez absolument aucun moyen de le savoir. Moralité : stockez toujours les dates/heures en GMT (qui ne tient pas compte de l'heure d'été) et convertissez-les dans le fuseau horaire souhaité lorsque cela est nécessaire.

1 votes

Par curiosité, pourquoi devons-nous régler le fuseau horaire nous-mêmes et le récupérer ensuite ? Cela va à l'encontre du but recherché, n'est-ce pas ? Je veux dire, j'aimerais demander le fuseau horaire à MySQL parce que je ne connais pas la réponse. Peut-être que je suis confus et que je me trompe. Quelqu'un peut-il m'expliquer ?

1 votes

@Senthil Le mySQL DATETIME ne contient pas d'informations sur le fuseau horaire. Par conséquent, je pense que la philosophie sous-jacente voulue ici est que mySQL soit aussi aveugle aux fuseaux horaires que possible - ce qui signifie que l'utilisateur doit s'en tenir à un seul fuseau horaire, soit UTC, soit le fuseau horaire du serveur, stocker tout dans ce fuseau, et effectuer toute conversion au niveau de l'application ou en utilisant CONVERT_TZ() ( dev.mysql.com/doc/refman/5.0/fr/ ) Du moins, c'est ainsi que j'ai toujours compris comment c'est censé fonctionner, en regardant les rares options que mySQL fournit dans ce domaine.

0 votes

Merci mais ce n'est toujours pas résolu, comment puis-je obtenir l'info tz par le résultat de now() en PHP ?

250voto

JohnZ Points 701

La requête ci-dessous renvoie le fuseau horaire de la session actuelle.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

7 votes

C'est vraiment la bonne réponse, car elle démontre que 'SYSTEM' est reconnu comme un fuseau horaire dans la conversion, ce qui est tout à fait suffisant pour convertir, par exemple, NOW() dans n'importe quel fuseau horaire.

5 votes

Merci, en utilisant ceci j'ai pu obtenir le format que je voulais : select time_format(timediff(now(),convert_tz(now(),@@session.time_z‌​one,'+00:00')),'%H%i‌​');

120 votes

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) est plus simple.

129voto

Andrew Points 2557

Tout simplement SELECT @@system_time_zone;

Renvoie à PST (ou ce qui est pertinent pour votre système).

Si vous essayez de déterminer le fuseau horaire de la session, vous pouvez utiliser cette requête :
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

qui renverra le fuseau horaire de la session s'il diffère du fuseau horaire du système.

7 votes

Le seul inconvénient est que si le fuseau horaire change en raison du passage à l'heure d'été, le serveur indiquera toujours celui qui a été "mémorisé" au moment du démarrage du serveur, cf. mysql bug 9518

0 votes

Il y a aussi un autre inconvénient - on dirait qu'il renvoie quelque chose dans la locale du système, donc il peut afficher quelque chose comme ()

85voto

Timo Huovinen Points 8283

Comme Jakub Vrána (Le créateur ou Adminer y NotORM ) mentionnés dans les commentaires, pour sélectionner le décalage du fuseau horaire actuel en TIME utiliser :

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Il reviendra : 02:00:00 si votre fuseau horaire est de +2:00 pour cette date

J'ai fait une fiche technique ici : Le fuseau horaire de MySQL doit-il être réglé sur UTC ?

0 votes

Ou SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP); pour obtenir la différence en secondes.

0 votes

Complément à @philfreo - notez que les paramètres doivent être inversés dans TIMESTAMPDIFF par rapport à TIMEDIFF. Pour reprendre l'exemple donné dans cette réponse, si TIMEDIFF retourne 02:00:00 le TIMESTAMPDIFF correspondant renverrait à -2 si l'unité est l'HEURE, -120 si l'unité est MINUTE, etc. Pour que le signe corresponde au fuseau horaire, il faut intervertir les paramètres : SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW()) renverra le résultat attendu 120 pour le fuseau horaire +2:00. La raison pour laquelle il faut spécifier les minutes est qu'il y a quelques fuseaux horaires qui ont un décalage de 30 ou 45 minutes, cf. fr.wikipedia.org/wiki/Time_zone

1 votes

Cette réponse est bien meilleure que la réponse acceptée car elle répond directement à la question et donne une solution au lieu d'une simple théorie.

3voto

Pekka 웃 Points 249607

Vérifiez Support du fuseau horaire du serveur MySQL et le system_time_zone variable du système. Cela vous aide-t-il ?

0 votes

Pouvez-vous préciser dans votre question quelles informations vous recherchez exactement (le fuseau horaire du serveur ? celui du client ?) et quels sont les outils à votre disposition ? Vous mentionnez PHP. Pouvez-vous accéder à la ligne de commande ?

5 votes

@user aussi, je trouve que vous passez pour un peu un con en descendant les réponses des gens qui essaient d'être utiles, et qui n'ont pas exactement tort. Je n'ai rien contre le vote ni la perte de points, mais votre attitude n'encourage pas vraiment à chercher plus loin une solution.

0 votes

Les outils sont PHP et MySQL, je veux obtenir des informations valides telles que GMT+8 ou quelque chose comme ça, une valeur entre -12~+12 ,mais juste pas SYSTEM Je vais upvote et ticket comme accepté si la réponse est correcte, mais désolé, je vais downvote si ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X