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

Quelqu'un sait s'il y a une telle fonction dans MySQL?

mise à JOUR

cela ne produit aucune information valide:

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

ou peut-être MySQL lui-même ne peut pas savoir exactement le time_zone utilisé,c'est très bien, nous pouvons impliquer PHP ici, aussi longtemps que je peux obtenir des informations valides pas comme SYSTEM ...

149
demandé sur hlopetz 2010-05-29 11:48:53

16 réponses

du manuel ( section 9.6 ):

les valeurs actuelles des fuseaux horaires globaux et spécifiques au client peuvent être récupérées comme ceci:

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

Modifier ci-dessus renvoie SYSTEM si MySQL est définie à l'esclave du système de fuseau horaire, ce qui est moins utile. Puisque vous utilisez PHP, si la réponse de MySQL est SYSTEM , vous pouvez alors demander au système quel fuseau horaire il est en utilisant via date_default_timezone_get . (Bien sûr, comme VolkerK l'a fait remarquer, PHP peut fonctionner sur un serveur différent, mais comme suppositions vont, en supposant que le serveur web et le serveur de base de données qu'il parle sont mis à [si pas réellement dans ] le même fuseau horaire n'est pas un énorme saut. Mais attention (comme avec MySQL), vous pouvez définir le fuseau horaire que PHP utilise ( date_default_timezone_set ), ce qui signifie qu'il peut signaler une valeur différente que L'OS utilise. Si vous êtes en contrôle du code PHP, vous devriez savoir si vous faites cela et être d'accord.

mais toute la question de savoir quel fuseau horaire le serveur MySQL utilise peut être une tangente, parce que demander au serveur quel fuseau horaire il est vous dit absolument rien sur les données de la base de données. Lire la suite pour details:

suite de la discussion :

si vous avez le contrôle du serveur, bien sûr vous pouvez vous assurer que le fuseau horaire est une quantité connue. Si vous n'êtes pas en contrôle du serveur, vous pouvez définir le fuseau horaire utilisé par votre connexion comme ceci:

set time_zone = '+00:00';

qui fixe le fuseau horaire à GMT, de sorte que toute autre opération (comme now() ) utilisera GMT.

notez, cependant, que les valeurs de temps et de date sont et non stockées avec des informations de 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)

donc connaître le fuseau horaire du serveur est seulement important en termes de fonctions qui obtiennent l'heure en ce moment, comme now() , unix_timestamp() , etc.; il n'a pas tout vous dire sur quel fuseau horaire les dates dans la base de données à l'aide. Vous pourriez choisir de supposer ils ont été écrits utiliser 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'ils sont stockés avec des informations de fuseau horaire ou (comme je le fais) s'assurer qu'ils sont toujours en GMT.

pourquoi supposer que les données ont été écrites en utilisant le fuseau horaire du serveur défectueux? Eh bien, pour une chose, les données peuvent avoir été écrites en utilisant une connexion qui a défini un fuseau horaire différent. La base de données peut avoir été déplacée d'un serveur à un autre, où les serveurs étaient dans des périodes différentes (je suis tombé sur cela quand j'ai hérité d'une base de données qui avait déménagé du Texas à la Californie). Mais même si les données sont écrites sur le serveur, avec son fuseau horaire actuel, c'est encore ambigu. L'an dernier, aux États-Unis, L'heure avancée a été désactivée à 2 h le 1er novembre. Supposons que mon serveur soit en Californie en utilisant 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? Être que 1 h 30 le 1er novembre HAP, ou 1 h 30 le 1er novembre PST (une heure plus tard)? Vous n'avez absolument aucun moyen de savoir. Moral: toujours stocker les dates/heures en GMT (qui ne fait pas DST) et convertir au fuseau horaire désiré comme/Quand nécessaire.

173
répondu T.J. Crowder 2010-05-29 09:08:53

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

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
155
répondu JohnZ 2013-06-15 22:48:54

simplement SELECT @@system_time_zone;

retourne 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 renvoie le fuseau horaire de la session s'il diffère du fuseau horaire du système.

69
répondu Andrew 2011-11-24 20:26:11

comme Jakub Vrána (le créateur ou administrateur et Nobm ) mentions dans les commentaires, pour sélectionner le fuseau horaire actuel offset dans TIME utiliser:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

il retournera: 02:00:00 si votre fuseau horaire est +2: 00 pour cette date

j'ai fait un cheatsheet ici: MySQL doit-il avoir son fuseau horaire réglé sur UTC?

48
répondu Timo Huovinen 2017-05-23 11:54:59
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

cela retournera le fuseau horaire comme un entier (par exemple: -6 ), en manipulant des temps positifs ou négatifs (voici où EXTRACT entre en jeu: HOUR la fonction seule retourne des temps négatifs comme positifs).

6
répondu Luca Fagioli 2015-02-07 19:38:33

pour obtenir le fuseau horaire du mysql vous pouvez faire les choses suivantes:

  1. SELECT @@ @ system_time_zone; //à partir de cela, vous pouvez obtenir le système timezone
  2. sélectionnez si (@@session.time_zone = 'SYSTÈME', @@system_time_zone, @@session.time_zone) //Cela vous donnera le temps de la zone si le système de fuseau horaire est différent de fuseau horaire global

maintenant si vous voulez changer le fuseau horaire mysql alors: 1. SET GLOBAL time_zone = '+00:00' / / Ceci définira mysql timezone en UTC 2. SET @ @ session.time_zone = "+00:00"; //par ceci vous pouvez changer le fuseau horaire seulement pour votre session particulière

4
répondu Abhinav bhardwaj 2016-03-10 08:52:21

sélectionner sec_to_time(TIME_TO_SEC (curtime ()) + 48000); ici vous pouvez spécifier vos différences de temps comme sec

2
répondu Bala Kayan 2017-06-20 06:24:34

Check out soutien du fuseau horaire du serveur MySQL et la variable système system_time_zone . Est-ce que c'est?

2
répondu Pekka 웃 2018-10-04 23:33:48

vous avez juste besoin de redémarrer mysqld après avoir modifié le fuseau horaire du système..

le fuseau horaire mondial de MySQL prend le fuseau horaire du système. Lorsque vous changez un tel attribut de système, vous avez juste besoin D'un redémarrage de Mysqld.

0
répondu Storm Young 2014-05-12 19:49:36

insérez un enregistrement fictif dans l'une de vos bases de données qui a un horodatage Sélectionnez cet enregistrement et obtenez la valeur de timestamp. Supprimez cet enregistrement. Obtient à coup sûr le fuseau horaire que le serveur utilise pour écrire des données et ignore les timezones PHP.

0
répondu alee 2015-07-27 09:49:59

mon cadre PHP utilise

SET LOCAL time_zone='Whatever'

après avoir connecté, où "Cela" = = date_default_timezone_get()

ce n'est pas ma solution, mais cela garantit que SYSTEM le fuseau horaire du serveur MySQL est toujours le même que celui de PHP

donc, oui, PHP est fortement impliqué et peut l'affecter

0
répondu vladkras 2016-01-08 07:24:37

utilisez LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+') pour obtenir une valeur dans le format timezone de MySQL que vous pouvez commodément utiliser avec CONVERT_TZ(). Notez que le décalage horaire que vous obtenez est uniquement valable au moment où l'expression est évaluée, puisque le décalage peut changer au fil du temps si vous avez de l'heure d'été. Pourtant L'expression est utile avec NOW() pour stocker l'offset avec l'heure locale, qui désamorce ce que NOW () rapporte. (En heure d'été timezones, NOW () recule d'une heure une fois par an, ce qui donne des valeurs dupliquées pour des points distincts dans le temps).

0
répondu rtc 2017-06-24 18:46:47

pour obtenir l'heure actuelle en fonction de votre fuseau horaire, vous pouvez utiliser ce qui suit (dans mon cas son '+5:30')

sélectionnez DATE_FORMAT (convert_tz (now (),@@session.time_zone,'+05:30') ,'%Y - %m - % d')

0
répondu Sanjoy Kanrar 2017-11-04 11:49:32

la mention de commande dans la description renvoie" SYSTEM " qui indique qu'il prend le fuseau horaire du serveur. Ce qui n'est pas utile pour notre requête.

la requête suivante aidera à comprendre le fuseau horaire

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

la requête ci-dessus vous donnera l'intervalle de temps par rapport au temps universel coordonné(UTC). Donc, vous pouvez facilement analyser le fuseau horaire. si le fuseau horaire de la base de données est IST la sortie sera 5: 30

UTC_TIMESTAMP

dans MySQL, L'UTC_TIMESTAMP renvoie la date et l'heure UTC courante comme une valeur dans 'YYYY-MM-JJ HH:MM:SS' ou YYYYMMDDHHMMSS.format uuuuuu dépendant de l'usage de la fonction, c'est-à-dire dans une chaîne ou un contexte numérique.

NOW ()

NOW() function. MySQL NOW () retourne la valeur de la date et de l'heure courante dans le format 'YYYY-MM-JJ HH:MM:SS' ou YYYYMMDDHHMMSS.uuuuuu format suivant le contexte numérique ou chaîne de caractères) de la fonction. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP() sont synonymes de NOW().

0
répondu FullStack 2018-09-18 13:44:48

C'est peut-être aussi stupide que cette

sélectionner timediff (current_time (), utc_time ())

comme l'ensemble de mysql

vous n'obtiendrez pas directement la valeur du fuseau horaire de cette façon, mais s'il n'y avait pas d'autre moyen...

@@global.time_zone ne peut pas être utilisé en vue car il s'agit d'une variable - et il renvoie une valeur tout à fait inutilisable 'SYSTEM' ( Je ne sais pas pourquoi quelqu'un s'en est soucié)

si vous devez utiliser votre requête dans une session avec time_zone modifié ( par session SET TIME_ZONE = ) vous obtiendrez que avec @@session.fuseau si vous interrogez @@global.time_zone vous obtenez 'SYSTEM' prise 22

si vous essayez datediff, date_sub, ou timediff avec now () et utc_time (), vous allez probablement vous retrouver avec des problèmes de conversion qui seront discrètement résolus par un serveur

la pire documentation que j'ai jamais vu ne pas vous aider non plus.

Excellent travail, tout le monde!

mais le quelque chose suggéré ci-dessus fonctionnera probablement au moins avec certaines versions de serveur comme la mienne (5.5.43-37) solution hébergée.

-1
répondu dwaid 2015-11-24 20:31:42

essayez le code suivant:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
-2
répondu Oscar Rojas 2018-01-30 19:21:46