web-dev-qa-db-fra.com

Comment faire pour que les fonctions NOW () et CURDATE () de MySQL utilisent UTC?

Je veux que les appels à NOW () et CURDATE () dans les requêtes MySQL renvoient la date en UTC. Comment puis-je y arriver sans passer par et modifier toutes les requêtes qui utilisent ces fonctions?

42
Chad Johnson

J'ai enfin trouvé ce que je cherchais ...

Dans my.cnf,

[mysqld_safe]
timezone = UTC

Je mettais cette option sous [mysqld], et mysql n'arrivait pas à démarrer.

Appel de "SET time_zone = '+ 0:00';" sur chaque chargement de page fonctionnerait également, mais je n'aime pas l'idée d'appeler cette requête sur chaque chargement de page.

35
Chad Johnson

Réglez l'horloge de votre serveur sur UTC. Pas vraiment.

Si vous pouvez le faire, faites-le.

L'un des plus gros maux de tête est les emplois "cron", etc., qui s'exécutent dans le fuseau horaire local, cela signifie que certains travaux cron seront manqués une fois par an, et tout le reste s'exécutera à une heure différente GMT pendant la moitié de l'année (je suppose vous êtes dans un fuseau horaire qui a l'heure d'été ici).

MySQL prend en charge le fuseau horaire, mais c'est fou et foiré. Ne l'utilisez pas si vous n'en avez pas besoin. Réglez simplement l'horloge de votre serveur sur UTC et l'heure commencera à fonctionner comme il se doit.

Je sais que changer l'horloge du serveur est un changement majeur pour tout système géré, et vous pouvez avoir un grand nombre de serveurs et de services qui pourraient être affectés, mais essayez de le faire quand même. Le travail d'AQ peut être important, mais essayez.

24
MarkR

Allez au fichier /etc/mysql/my.cnf et ajoutez cette ligne ci-dessous dans la section [mysqld]

fuseau horaire par défaut = '+00: 00'

Redémarrez ensuite votre mysql. Sélectionnez maintenant curtime (); montre l'heure GMT.

14
arulraj.net

Si changer le fuseau horaire sur vos serveurs de production en cours d'exécution ou mettre à jour un paramètre de configuration clé et redémarrer mysql semble irréaliste et/ou excessif, essayez ceci:

CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')

US/Pacific Est le fuseau horaire dans lequel votre appel NOW() renvoie l'heure.

8
Dan

La bonne façon de le faire est de changer le fuseau horaire de votre serveur en UTC, comme l'a dit MarkR.

Cependant, il est également possible d'utiliser SET time_zone pour changer le fuseau horaire de votre session en cours.

Du manuel:

Le paramètre de fuseau horaire de la session en cours affecte l'affichage et le stockage des valeurs horaires qui sont sensibles aux zones. Cela inclut les valeurs affichées par des fonctions telles que NOW () ou CURTIME ()

4
andri
UTC_TIMESTAMP()

Renvoie la date et l'heure UTC actuelles sous forme de valeur au format 'AAAA-MM-JJ hh: mm: ss' ou AAAAAMMJJhhmmss.uuuuuu, selon que la fonction est utilisée dans une chaîne ou dans un contexte numérique.

UTC_DATE()

Renvoie la date UTC actuelle sous la forme d'une valeur au format 'AAAA-MM-JJ' ou AAAAAMMJJ, selon que la fonction est utilisée dans une chaîne ou dans un contexte numérique.

UTC_TIME()

Renvoie l'heure UTC actuelle sous forme de valeur au format "hh: mm: ss" ou hhmmss.uuuuuu, selon que la fonction est utilisée dans une chaîne ou dans un contexte numérique.

Référence MySQL: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_utc-timestamp

3
wasserholz

Vous devrez utiliser l'instruction SET TIMESTAMP pour formater les résultats datetime au format souhaité. Cela impliquera de modifier toutes ces requêtes. sysdate () n'obéira cependant pas à cela.

0
websch01ar