Ich bin nicht sicher, was ich zu den obigen Antworten hinzufügen kann, aber hier sind einige Punkte von mir:
Arten von Zeiten
Es gibt vier verschiedene Zeiten, die Sie berücksichtigen sollten:
- Ereigniszeit: z. B. die Zeit, zu der ein internationales Sportereignis stattfindet, oder eine Krönung / Tod / etc. Dies hängt von der Zeitzone des Ereignisses und nicht vom Betrachter ab.
- Fernsehzeit: ZB wird eine bestimmte Fernsehsendung weltweit um 21 Uhr Ortszeit ausgestrahlt. Wichtig, wenn Sie darüber nachdenken, die Ergebnisse (z. B. American Idol) auf Ihrer Website zu veröffentlichen
- Relative Zeit: zB: Diese Frage hat ein offenes Kopfgeld, das in 21 Stunden geschlossen wird. Dies ist einfach anzuzeigen
- Wiederkehrende Zeit: zB: Eine TV-Show läuft jeden Montag um 21 Uhr, auch wenn sich die Sommerzeit ändert.
Es gibt auch historische / alternative Zeit. Diese sind ärgerlich, da sie möglicherweise nicht auf die Standardzeit zurückgeführt werden. ZB: Julianische Daten, Daten nach einem Mondkalender auf Saturn, dem klingonischen Kalender.
Das Speichern von Start- / Endzeitstempeln in UTC funktioniert gut. Für 1 benötigen Sie einen Ereigniszeitzonennamen + Offset, der zusammen mit dem Ereignis gespeichert wird. Für 2 benötigen Sie eine lokale Zeitkennung, die in jeder Region gespeichert ist, und einen lokalen Zeitzonennamen + Offset, der für jeden Betrachter gespeichert ist (dies kann aus der IP abgeleitet werden, wenn Sie sich in einer Krise befinden). Für 3 in UTC Sekunden speichern und keine Zeitzonen erforderlich. 4 ist ein Sonderfall von 1 oder 2, je nachdem, ob es sich um ein globales oder ein lokales Ereignis handelt. Sie müssen jedoch auch ein zum Zeitstempel erstelltes Ereignis speichern, damit Sie feststellen können, ob sich eine Zeitzonendefinition vor oder nach dem Erstellen dieses Ereignisses geändert hat. Dies ist erforderlich, wenn Sie historische Daten anzeigen müssen.
Speicherzeiten
- Speichern Sie die Zeit immer in UTC
- In angezeigte Ortszeit konvertieren (lokal wird vom Benutzer definiert, der die Daten betrachtet)
- Beim Speichern einer Zeitzone benötigen Sie den Namen, den Zeitstempel und den Versatz. Dies ist erforderlich, weil Regierungen manchmal die Bedeutung ihrer Zeitzonen ändern (z. B. die US-Regierung hat die Sommerzeitdaten geändert) und Ihre Anwendung die Dinge ordnungsgemäß handhaben muss ... z. B.: Der genaue Zeitstempel, in dem Episoden von LOST sowohl vor als auch nach den Sommerzeitregeln angezeigt wurden geändert.
Offsets und Namen
Ein Beispiel für das Obige wäre:
Das Fußball-WM-Endspiel fand am 11. Juli 2010 um 19:00 UTC in Südafrika (UTC + 2 - SAST) statt.
Mit diesen Informationen können wir historisch den genauen Zeitpunkt bestimmen, zu dem das WCS-Finale 2010 stattfand, selbst wenn sich die Definition der südafrikanischen Zeitzone ändert, und dies den Zuschauern in ihrer lokalen Zeitzone zum Zeitpunkt der Abfrage der Datenbank anzeigen.
Systemzeit
Sie müssen auch Ihre Betriebssystem-, Datenbank- und Anwendungs-tzdata-Dateien sowohl untereinander als auch mit dem Rest der Welt synchron halten und beim Upgrade ausgiebig testen. Es ist nicht ungewöhnlich, dass eine Drittanbieter-App, auf die Sie angewiesen sind, eine TZ-Änderung nicht korrekt verarbeitet hat.
Stellen Sie sicher, dass die Hardware-Uhren auf UTC eingestellt sind. Wenn Sie Server auf der ganzen Welt ausführen, stellen Sie sicher, dass deren Betriebssysteme auch für die Verwendung von UTC konfiguriert sind. Dies wird deutlich, wenn Sie stündlich gedrehte Apache-Protokolldateien von Servern in mehreren Zeitzonen kopieren müssen. Das Sortieren nach Dateinamen funktioniert nur, wenn alle Dateien mit derselben Zeitzone benannt sind. Es bedeutet auch, dass Sie keine Datumsberechnung in Ihrem Kopf durchführen müssen, wenn Sie von einer Box zur nächsten wechseln und Zeitstempel vergleichen müssen.
Führen Sie außerdem ntpd für alle Boxen aus.
Kunden
Vertrauen Sie niemals dem Zeitstempel, den Sie von einem Client-Computer erhalten, als gültig. Zum Beispiel die Date: HTTP-Header oder ein Javascript- Date.getTime()
Aufruf. Diese sind in Ordnung, wenn sie als undurchsichtige Bezeichner verwendet werden oder wenn während einer einzelnen Sitzung auf demselben Client Datumsberechnungen durchgeführt werden. Versuchen Sie jedoch nicht, diese Werte mit etwas auf dem Server zu vergleichen. Ihre Clients führen kein NTP aus und verfügen möglicherweise nicht unbedingt über einen funktionierenden Akku für ihre BIOS-Uhr.
Wissenswertes
Schließlich werden Regierungen manchmal sehr seltsame Dinge tun:
Die Standardzeit in den Niederlanden betrug vom 1909-05-01 bis zum 1937-06-30 laut Gesetz genau 19 Minuten und 32,13 Sekunden vor UTC. Diese Zeitzone kann im HH: MM-Format nicht genau dargestellt werden.
Ok, ich denke ich bin fertig.
GETDATE()
unter SQL ist UTC (wie auchDateTime.Now
). Und der Server wird durch keine automatischen Sommerzeitänderungen beeinflusst.