MySQL
Umgang mit Zeitzonen
Suche…
Bemerkungen
Wenn Sie Zeitinformationen für eine weltweite Benutzerbasis in MySQL verarbeiten müssen, verwenden Sie den TIMESTAMP-Datentyp in Ihren Tabellen.
Speichern Sie für jeden Benutzer eine Timezone-Spalte mit Benutzereinstellungen. VARCHAR (64) ist ein guter Datentyp für diese Spalte. Wenn sich ein Benutzer registriert, um Ihr System zu verwenden, fragen Sie nach dem Zeitzonenwert. Mein ist Atlantic Time, America/Edmonton
. Ihr könnte Asia/Kolkata
oder Australia/NSW
sein oder nicht. Für eine Benutzeroberfläche für diese Benutzereinstellung bietet die WordPress.org-Software ein gutes Beispiel.
Wann immer Sie eine Verbindung von Ihrem Host-Programm (Java, PHP, was auch immer) zu Ihrem DBMS für einen Benutzer herstellen, geben Sie den SQL-Befehl aus
SET SESSION time_zone='(whatever tz string the user gave you)'
bevor Sie mit Benutzerdaten umgehen, die zeitaufwendig sind. Dann werden alle TIMESTAMP
Zeiten, die Sie installiert haben, in der Ortszeit des Benutzers TIMESTAMP
.
Dies führt dazu, dass alle Zeitangaben in Ihren Tabellen in UTC konvertiert werden und alle Zeitangaben in lokal übersetzt werden. Es funktioniert einwandfrei für JETZT () und CURDATE (). Auch hier müssen Sie die Datentypen TIMESTAMP und nicht DATETIME oder DATE verwenden.
Stellen Sie sicher, dass das Server-Betriebssystem und die Standard-MySQL-Zeitzonen auf UTC eingestellt sind. Wenn Sie dies nicht tun, bevor Sie mit dem Laden von Informationen in Ihre Datenbank beginnen, ist es fast unmöglich, das Problem zu beheben. Wenn Sie einen Anbieter zum Ausführen von MySQL verwenden, bestehen Sie darauf, dass diese das Recht haben.
Abrufen des aktuellen Datums und der Uhrzeit in einer bestimmten Zeitzone.
Hiermit wird der Wert von NOW()
in der Ortszeit, in der indischen Standardzeit und dann erneut in UTC abgerufen.
SELECT NOW();
SET time_zone='Asia/Kolkata';
SELECT NOW();
SET time_zone='UTC';
SELECT NOW();
Konvertieren Sie einen gespeicherten Wert für 'DATE' oder 'DATETIME' in eine andere Zeitzone.
Wenn Sie ein DATE
oder DATETIME
(in einer Spalte irgendwo) gespeichert haben, wurde es in Bezug auf eine Zeitzone gespeichert, aber in MySQL wird die Zeitzone nicht mit dem Wert gespeichert. Wenn Sie es in eine andere Zeitzone konvertieren möchten, können Sie dies tun, aber Sie müssen die ursprüngliche Zeitzone kennen. Mit CONVERT_TZ()
wird die Konvertierung durchgeführt. Dieses Beispiel zeigt Zeilen, die in Kalifornien in Ortszeit verkauft wurden.
SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
FROM sales
WHERE state_sold = 'CA'
Abrufen von gespeicherten TIMESTAMP-Werten in einer bestimmten Zeitzone
Das ist sehr einfach. Alle TIMESTAMP
Werte werden in Universalzeit gespeichert und bei jeder TIMESTAMP
immer in die time_zone
Einstellung time_zone
konvertiert.
SET SESSION time_zone='America/Los_Angeles';
SELECT timestamp_sold
FROM sales
WHERE state_sold = 'CA'
Warum ist das? TIMESTAMP
Werte basieren auf dem ehrwürdigen UNIX time_t
Datentyp . Diese UNIX-Zeitmarken werden seit 1970-01-01 00:00:00
UTC in Sekunden 1970-01-01 00:00:00
.
Hinweis TIMESTAMP
Werte werden in TIMESTAMP
gespeichert. DATE
und DATETIME
Werte werden gespeichert in welcher Ortszeit in Kraft war , als sie gespeichert wurden.
Wie ist die lokale Zeitzoneneinstellung meines Servers?
Jeder Server verfügt über eine globale Einstellung von time_zone, die vom Eigentümer der Server-Maschine konfiguriert wird. Sie können die aktuelle Zeitzoneneinstellung auf folgende Weise ermitteln:
SELECT @@time_zone
Leider ergibt dies normalerweise den Wert SYSTEM
, dh die MySQL-Zeit wird durch die Zeitzoneneinstellung des Server-Betriebssystems bestimmt.
Diese Abfolge von Abfragen (ja, es ist ein Hack ) gibt Ihnen den Versatz in Minuten zwischen der Zeitzoneneinstellung des Servers und UTC zurück.
CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;
Wie funktioniert das? Die zwei Spalten in der temporären Tabelle mit unterschiedlichen Datentypen sind der Hinweis. DATETIME
-Datentypen werden immer in Ortszeit in Tabellen und TIMESTAMP
in UTC gespeichert. Die INSERT
Anweisung, die ausgeführt wird, wenn time_zone auf UTC gesetzt ist, speichert also zwei identische Datums- / Uhrzeitwerte.
Dann wird die SELECT-Anweisung ausgeführt, wenn time_zone auf Serverzeit eingestellt ist. TIMESTAMP
werden in SELECT-Anweisungen immer aus ihrer gespeicherten UTC-Form in die Ortszeit übersetzt. DATETIME
sind nicht. Die TIMESTAMPDIFF(MINUTE...)
berechnet also die Differenz zwischen Ortszeit und TIMESTAMPDIFF(MINUTE...)
.
Welche time_zone-Werte sind auf meinem Server verfügbar?
Verwenden Sie diesen Befehl, um eine Liste der möglichen time_zone-Werte in Ihrer MySQL-Serverinstanz abzurufen.
SELECT mysql.time_zone_name.name
Normalerweise wird hier die ZoneInfo-Liste der Zeitzonen angezeigt, die von Paul Eggert bei der Internet Assigned Numbers Authority verwaltet wird . Weltweit gibt es ca. 600 Zeitzonen.
Unix-ähnliche Betriebssysteme (z. B. Linux-Distributionen, BSD-Distributionen und moderne Mac OS-Distributionen) erhalten Routineupdates. Durch die Installation dieser Updates auf einem Betriebssystem können die dort ausgeführten MySQL-Instanzen die Änderungen der Zeitzonen sowie der Umstellung auf Tageslicht / Standardzeit nachverfolgen.
Wenn Sie eine viel kürzere Liste von Zeitzonennamen erhalten, ist Ihr Server entweder unvollständig konfiguriert oder läuft unter Windows. Hier finden Sie Anweisungen für Ihren Serveradministrator zum Installieren und Verwalten der ZoneInfo-Liste.