Leider gibt es dafür keine schnelle Lösung. Die Internationalisierung einer Anwendung sollte Teil der allerersten Designdiskussionen sein, da sie den Kern vieler verschiedener Bereiche betrifft, einschließlich Datums- / Uhrzeitvergleiche und Ausgabeformatierung.
Auf jeden Fall ist es wichtig, die Zeitzoneninformationen mit der Zeit zu speichern, um den Überblick über Doing It Right zu behalten . Mit anderen Worten realisieren, dass das Datum / Zeit 20130407 14:50
ist sinnlos , ohne entweder (a) mit der dann aktuellen UTC der Zeitzone versetzt (Anmerkung 1) , oder (b) sichergestellt wird, dass alle Logik dieser Werte zuerst wandelt in einem bestimmten festgelegten Offset Einfügen ( höchstwahrscheinlich 0). Ohne diese beiden Dinge sind zwei angegebene Zeitwerte nicht vergleichbar und die Daten sind fehlerhaft . (Die letztere Methode spielt übrigens mit dem Feuer (Anmerkung 2) ; tun Sie das nicht.)
In SQL Server 2008+ können Sie den Versatz mit der Zeit direkt mithilfe des datetimeoffset
Datentyps speichern. (Der Vollständigkeit halber habe ich 2005 und früher eine zweite Spalte hinzugefügt, um den aktuellen UTC-Offset-Wert (in Minuten) zu speichern.)
Dies erleichtert eine Desktop-Anwendung, da diese Plattformen normalerweise über Mechanismen verfügen, mit denen Datum / Zeit + Zeitzone automatisch in eine Ortszeit konvertiert und dann entsprechend den regionalen Einstellungen des Benutzers für die Ausgabe formatiert werden.
Für das Web, bei dem es sich um eine von Natur aus getrennte Architektur handelt, ist es auch bei ordnungsgemäß eingerichteten Back-End-Daten komplexer, da Sie Informationen zum Client benötigen, um die Konvertierung und / oder Formatierung durchführen zu können. Dies erfolgt in der Regel über Benutzereinstellungen (die Anwendung konvertiert / formatiert Dinge vor der Ausgabe) oder einfach durch Anzeigen von Dingen mit demselben festen Format und Zeitzonenversatz für alle (wie dies derzeit auf der Stack Exchange-Plattform der Fall ist).
Sie können feststellen, dass die Einrichtung der Back-End-Daten sehr schnell kompliziert und schwierig wird. Ich würde nicht empfehlen, einen dieser Pfade zu beschreiten, da Sie später einfach mehr Probleme haben werden.
Anmerkung 1:
Der UTC-Versatz einer Zeitzone ist nicht festgelegt: Berücksichtigen Sie die Sommerzeit, wenn der UTC-Versatz einer Zone um plus oder minus eine Stunde variiert. Auch die Sommerzeitdaten der Zonen variieren regelmäßig. Die Verwendung von datetimeoffset
(oder einer Kombination aus local time
und UTC offset at that time
) führt zu einer maximalen Wiederherstellung von Informationen.
Anmerkung 2:
Es geht darum, Dateneingaben zu steuern. Es gibt zwar keine narrensichere Möglichkeit, eingehende Werte zu validieren, es ist jedoch besser, einen einfachen Standard zu erzwingen, der keine Berechnungen umfasst. Wenn eine öffentliche API einen Datentyp erwartet, der einen Offset enthält, ist diese Anforderung für den Aufrufer klar.
Wenn dies nicht der Fall ist, muss sich der Aufrufer auf die Dokumentation verlassen (wenn er sie liest), oder die Berechnung wird falsch durchgeführt usw. Es gibt weniger Fehler- / Fehlermodi, wenn ein Offset erforderlich ist, insbesondere für ein verteiltes System ( oder auch nur Web / Datenbank auf separaten Servern (wie hier der Fall).
Das Speichern des Offsets tötet ohnehin zwei Fliegen mit einer Klappe; und selbst wenn das jetzt nicht benötigt wird , wird die möglichkeit später bei bedarf zur verfügung gestellt. Zwar nimmt es mehr Speicherplatz in Anspruch, aber ich denke, es lohnt sich, dies in Kauf zu nehmen, da die Daten verloren gehen, wenn sie überhaupt nicht aufgezeichnet werden.