Ich habe es für meine Zwecke herausgefunden. Ich werde zusammenfassen, was ich gelernt habe (Entschuldigung, diese Notizen sind ausführlich; sie sind für meine zukünftige Überweisung genauso wichtig wie alles andere).
Im Gegensatz zu dem, was ich in einem meiner vorherigen Kommentare gesagt habe, verhalten sich die Felder DATETIME und TIMESTAMP unterschiedlich. TIMESTAMP-Felder (wie in den Dokumenten angegeben) nehmen alles, was Sie senden, im Format "JJJJ-MM-TT hh: mm: ss" und konvertieren es von Ihrer aktuellen Zeitzone in die UTC-Zeit. Das Gegenteil geschieht transparent, wenn Sie die Daten abrufen. DATETIME-Felder führen diese Konvertierung nicht durch. Sie nehmen alles, was Sie ihnen senden, und speichern es direkt.
Weder die Feldtypen DATETIME noch TIMESTAMP können Daten in einer Zeitzone genau speichern, in der die Sommerzeit eingehalten wird . Wenn Sie "2009-11-01 01:30:00" speichern, können die Felder nicht unterscheiden, welche Version von 1:30 Uhr Sie möchten - die Version -04: 00 oder -05: 00.
Ok, wir müssen unsere Daten in einer Zeitzone ohne Sommerzeit (z. B. UTC) speichern. TIMESTAMP-Felder können diese Daten aus Gründen, die ich erläutern werde, nicht genau verarbeiten: Wenn Ihr System auf eine DST-Zeitzone eingestellt ist, ist das, was Sie in TIMESTAMP eingeben, möglicherweise nicht das, was Sie zurückbekommen. Selbst wenn Sie Daten senden, die Sie bereits in UTC konvertiert haben, werden die Daten in Ihrer lokalen Zeitzone übernommen und eine weitere Konvertierung in UTC durchgeführt. Diese von TIMESTAMP erzwungene Hin- und Rückfahrt von lokal zu UTC zurück zu lokal ist verlustbehaftet, wenn Ihre lokale Zeitzone die Sommerzeit einhält (seit "2009-11-01 01:30:00" zwei verschiedenen möglichen Zeiten zugeordnet sind).
Mit DATETIME können Sie Ihre Daten in jeder gewünschten Zeitzone speichern und sicher sein, dass Sie alles zurückerhalten, was Sie senden (Sie werden nicht in die verlustbehafteten Roundtrip-Konvertierungen gezwungen, die Ihnen TIMESTAMP-Felder auferlegen). Die Lösung besteht also darin, ein DATETIME-Feld zu verwenden und vor dem Speichern in das Feld von Ihrer Systemzeitzone in eine Nicht-DST-Zone zu konvertieren, in der Sie es speichern möchten (ich denke, UTC ist wahrscheinlich die beste Option). Auf diese Weise können Sie die Konvertierungslogik in Ihre Skriptsprache integrieren, sodass Sie das UTC-Äquivalent von "2009-11-01 01:30:00 -04: 00" oder "" 2009-11-01 01:30: 00 -05: 00 ".
Ein weiterer wichtiger Punkt ist, dass die mathematischen Funktionen von MySQL für Datum und Uhrzeit nicht richtig um die Sommerzeitgrenzen herum funktionieren, wenn Sie Ihre Daten in einer Sommerzeit-TZ speichern. Umso mehr Grund, in UTC zu sparen.
Kurz gesagt, ich mache jetzt Folgendes:
Beim Abrufen der Daten aus der Datenbank:
Interpretieren Sie die Daten aus der Datenbank explizit als UTC außerhalb von MySQL, um einen genauen Unix-Zeitstempel zu erhalten. Ich benutze dafür die Funktion strtotime () von PHP oder die DateTime-Klasse. Dies kann in MySQL mit den Funktionen CONVERT_TZ () oder UNIX_TIMESTAMP () von MySQL nicht zuverlässig durchgeführt werden, da CONVERT_TZ nur einen Wert 'JJJJ-MM-TT hh: mm: ss' ausgibt, der unter Mehrdeutigkeitsproblemen leidet, und UNIX_TIMESTAMP () seinen Wert annimmt Die Eingabe erfolgt in der Systemzeitzone, nicht in der Zeitzone, in der die Daten tatsächlich gespeichert wurden (UTC).
Beim Speichern der Daten in der Datenbank:
Konvertieren Sie Ihr Datum in die genaue UTC-Zeit, die Sie außerhalb von MySQL wünschen. Beispiel: Mit der DateTime-Klasse von PHP können Sie "2009-11-01 1:30:00 EST" deutlich von "2009-11-01 1:30:00 EDT" angeben, diese dann in UTC konvertieren und die richtige UTC-Zeit speichern zu Ihrem DATETIME-Feld.
Puh. Vielen Dank für alle Beiträge und Hilfe. Hoffentlich erspart dies jemand anderem später Kopfschmerzen.
Übrigens sehe ich das auf MySQL 5.0.22 und 5.0.27