2009-06-03 5 views
38

Ich möchte es so machen ruft auf NOW() und CURDATE() in MySQL-Abfragen das Datum in UTC zurück. Wie führe ich das durch, ohne alle Abfragen zu durchlaufen und zu ändern, die diese Funktionen verwenden?Wie verwende ich die Funktionen NOW() und CURDATE() von MySQL, die UTC verwenden?

+9

Nicht genau was Sie fragen, aber manchmal ist es besser zu verwenden UTC_TIMESTAMP() –

+0

Dies könnte Ihnen helfen: http://stackoverflow.com/questions/19023978/should-mysql-have-its-timezone-set -to-utc –

+0

Wie wäre es damit: http://w3resource.com/mysql/date -und-time-functions/mysql-utc_timestamp-function.php – zx1986

Antwort

33

Schließlich fand, was ich suchte ...

In my.cnf,

[mysqld_safe] 
timezone = UTC 

Ich war Setzen Sie diese Option auf [mysqld] und mysql konnte nicht starten.

Aufruf "SET time_zone = '+ 0:00';" auf jeder Seite laden würde auch funktionieren, aber ich mag nicht die Idee, diese Abfrage bei jeder einzelnen Seite laden.

+0

Also, es ist für jeden wahr, dass timezone = UTC in [mysqld_safe] gehen muss und nicht in [mysqld]? – Jimmy

+2

Wenn Sie [mysqld] einfügen, kann es nicht gestartet werden. Aber für mich fügt das Einfügen von [mysqld_safe] Daten immer noch als Ortszeit ein, wenn Sie NOW() verwenden. – sigurdga

+0

Diese Einstellung ändert nicht mysql zu UTC für mich - mysql 5.5.47-0ubuntu0.14.04.1. arulrajs Antwort unten funktionierte jedoch für mich. – Julian

23

Stellen Sie die Uhr Ihres Servers auf UTC ein. Nicht wirklich.

Wenn Sie es tun können, tun Sie es.

Einer der größten Kopfschmerzen ist "Cron" Jobs etc, in der lokalen Zeitzone ausgeführt, das bedeutet, dass einige Cron-Jobs einmal im Jahr verpasst werden, und alle anderen laufen zu einem anderen Zeitpunkt GMT für das halbe Jahr (Ich gehe davon aus, dass Sie sich in einer Zeitzone befinden, die hier Sommerzeit hat.

MySQL hat Zeitzonenunterstützung, aber es ist verrückt und durcheinander. Benutze es nicht, wenn du es nicht musst. Stellen Sie einfach die Uhr Ihres Servers auf UTC und die Zeit beginnt zu arbeiten, wie es sollte.

Ich weiß, dass die Uhr des Servers zu ändern für jedes verwaltete System eine große Veränderung ist, und Sie können eine große Anzahl von Servern und Diensten haben, die betroffen sein könnten, aber bitte versuchen Sie es trotzdem zu tun. Die QA-Arbeit kann wichtig sein, aber versuchen Sie es.

+0

Ich habe das schon mal gelesen und mich gefragt, was du bei der Entwicklung machst? Stellen Sie die Zeit Ihres Entwicklungs-PCs auf UTC ein? –

+5

Sie entwickeln in VMs und legen die Uhr der VMs auf UTC fest. Entwickeln Sie nie auf Ihrem Desktop-PC, es ist ein Schmerz in vielerlei Hinsicht, vor allem, wenn es ein Windows-PC ist, der von Ihrer IT-Abteilung verwaltet wird, die willkürlich Konfigurationsänderungen über Gruppenrichtlinien aus einer Laune heraus vornehmen. – MarkR

+0

Dies ist definitiv der Weg, es zu tun. Stellen Sie nach dem Einrichten der VM-Zeitzone sicher, dass der MySQL-Server neu gestartet wird. – DanO

0

Sie müssen die SET TIMESTAMP-Anweisung verwenden, um die Datetime-Ergebnisse im gewünschten Format zu formatieren. Dies bedeutet, dass alle diese Abfragen geändert werden müssen. sysdate() wird dies jedoch nicht beachten.

4

Der richtige Weg, dies zu tun, ist die Zeitzone des Servers in UTC zu ändern, genau wie MarkR sagte.

Es ist jedoch auch möglich, SET time_zone zu verwenden, um die Zeitzone für Ihre aktuelle Sitzung zu ändern.

Aus dem Handbuch:

Die aktuelle Sitzung Zeitzoneneinstellung beeinflusst Anzeige und Speicherung von Zeitwerten, die Zone empfindlich sind. Dazu gehören auch die durch Funktionen angezeigten Werte wie NOW() oder CURTIME()

12

Goto /etc/mysql/my.cnf Datei und fügen Sie diese unter der Zeile unter [mysqld] -Abschnitt

default-Zeitzone = '+00: 00'

Dann starten deine mysql. Wählen Sie nun curtime(); Zeigt die GMT-Zeit an.

+0

auf Mac OSX, Homebrew MySQL 5.6 das funktioniert nicht. – Jaap

7

Wenn die Änderung der Zeitzone auf dem laufenden Produktionsserver oder eine Schlüsselkonfigurationseinstellung zu aktualisieren und neu zu starten mysql scheint unrealistisch und/oder übertrieben, versuchen Sie dies:

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

Wo US/Pacific die Zeitzone Ihre NOW() Aufruf der zurückkehrt ist Zeit in.

+0

Beachten Sie, dass hierzu die [Zeitzonentabellen ausgefüllt werden müssen] (https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html) – Dezza