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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow