2009-06-03 5 views
38

Je veux faire en sorte que les appels à NOW() et CURDATE() dans les requêtes MySQL renvoient la date en UTC. Comment faire pour que cela se produise sans passer par et changer toutes les requêtes qui utilisent ces fonctions?Comment faire pour que les fonctions NOW() et CURDATE() de MySQL utilisent UTC?

+9

Pas exactement ce que vous demandez, mais il est parfois préférable d'utiliser UTC_TIMESTAMP() –

+0

Cela pourrait vous aider: http://stackoverflow.com/questions/19023978/should-mysql-have-its-timezone-set -to-utc –

+0

que diriez-vous de ceci: http://w3resource.com/mysql/date -and-time-functions/mysql-utc_timestamp-function.php – zx1986

Répondre

33

enfin trouvé ce que je cherchais ...

En my.cnf,

[mysqld_safe] 
timezone = UTC 

J'étais mettre cette option sous [mysqld], et mysql ne parvenait 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.

+0

Donc, c'est vrai pour tout le monde que timezone = UTC doit aller dans [mysqld_safe], et non dans [mysqld]? – Jimmy

+2

Le mettre dans [mysqld] le rend incapable de démarrer. Mais pour moi, le mettre dans [mysqld_safe] met toujours les dates en heure locale lorsque vous utilisez NOW(). – sigurdga

+0

Ce paramètre ne modifie pas mysql en UTC pour moi - mysql 5.5.47-0ubuntu0.14.04.1. La réponse d'arulraj ci-dessous a fonctionné pour moi, cependant. – Julian

23

Définissez l'horloge de votre serveur sur UTC. Pas vraiment.

Si vous pouvez le faire, faites-le. L'un des plus gros problèmes est le "cron" des travaux etc, fonctionnant dans le fuseau horaire local, cela signifie que certains travaux cron seront manqués une fois par an, et tout le reste fonctionnera à un autre moment GMT pendant la moitié de l'année (Je suppose que vous êtes dans un fuseau horaire qui a l'heure d'été ici). MySQL a un support de fuseau horaire, mais c'est fou et foiré. Ne l'utilisez pas si vous ne le devez pas. Réglez simplement l'horloge de votre serveur sur UTC et l'heure commencera à fonctionner comme elle le devrait. Je sais que la modification de l'horloge du serveur est un changement majeur pour tout système géré, et que vous pourriez avoir un grand nombre de serveurs et de services qui pourraient être affectés, mais essayez de le faire malgré tout. Le travail d'assurance qualité peut être important, mais essayez.

+0

J'ai déjà lu ceci, et je me demandais ce que vous faisiez quand vous développez? Est-ce que vous définissez le temps de votre PC de développement à UTC? –

+5

Vous développez dans des machines virtuelles et définissez les horloges de machines virtuelles à UTC. Ne vous développez jamais sur votre PC de bureau, c'est très pénible, surtout s'il s'agit d'un PC Windows géré par le service informatique de votre entreprise qui effectue des changements de configuration arbitraires via la stratégie de groupe sur un coup de tête. – MarkR

+0

C'est certainement le moyen de le faire. Après avoir défini le fuseau horaire de votre machine virtuelle, assurez-vous de redémarrer le serveur MySQL. – DanO

0

Vous devrez utiliser l'instruction SET TIMESTAMP pour mettre en forme les résultats datetime dans le format souhaité. Cela signifiera changer toutes ces requêtes. sysdate() n'obéira pas à cela.

4

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

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

A partir du manuel:

Le réglage de l'heure de la session de la zone affecte l'affichage et le stockage des valeurs de temps qui sont sensibles à la zone. Cela inclut les valeurs affichées par des fonctions telles que NOW() ou CURTIME()

12

fichier Goto et ajoutez cette ligne ci-dessous sous section [mysqld]

default-time-zone = ': +00 00'

puis redémarrez votre mysql. Maintenant, sélectionnez curtime(); montre l'heure GMT.

+0

sur mac osx, homebrew mysql 5.6 cela ne fonctionne pas. – Jaap

7

Si vous changez le fuseau horaire sur vos serveurs de production en cours d'exécution ou la mise à jour d'un paramètre de configuration clé et le redémarrage de MySQL ne semble pas réaliste et/ou surpuissant, essayez ceci:

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

US/Pacific est le fuseau horaire de votre NOW() appel renvoie le

+0

Notez que cela nécessite que [les tables de fuseaux horaires soient remplies] (https://dev.mysql.com/doc/refman/5.7/fr/time-zone-support.html) – Dezza

Questions connexes