Normalerweise habe ich einen "Interceptor", der unmittelbar vor dem Lesen / Schreiben aus / in die Datenbank die DateTime-Konvertierung (von UTC in Ortszeit und von Ortszeit in UTC) durchführt, sodass ich DateTime.Now
(Ableitungen und Vergleiche) im gesamten System verwenden kann, ohne mir Sorgen machen zu müssen über Zeitzonen.
In Bezug auf die Serialisierung und das Verschieben von Daten zwischen Computern besteht kein Grund zur Sorge, da die Datums- und Uhrzeitangabe immer UTC ist.
Soll ich meine Daten (SQL 2008 - datetime) weiterhin im UTC-Format speichern oder stattdessen mit DateTimeOffset
(SQL 2008 - datetimeoffset) speichern?
UTC-Daten in der Datenbank (Datum / Uhrzeit-Typ) haben so lange funktioniert und sind bekannt. Warum sollten Sie sie ändern? Was sind die Vorteile?
Ich habe mir bereits Artikel wie diesen angesehen , bin aber nicht zu 100% überzeugt. Irgendwelche Gedanken?
quelle
Antworten:
Es gibt einen großen Unterschied, bei dem Sie UTC nicht alleine verwenden können.
Wenn Sie ein solches Szenario haben
Dann:
Aber:
Ein einfaches Beispiel ist das Reservierungssystem für Flugtickets ... Das Flugticket sollte zwei Mal enthalten: - Startzeit (in der Zeitzone der Stadt "Von") - Landezeit (in der Zeitzone der Stadt "Ziel")
quelle
InputLocationId
(oder einer ähnlichen normalisierten Entität) herausziehen . Es wäre eine Berechnung erforderlich (Hallo, Ausnahmen ... besonders Sie, Indiana ), aber es ist immer noch ein deterministischer Prozess - und dann ist das Gleichgewicht der Datums- / Uhrzeitlogik der App unkompliziert.Es ist absolut richtig, UTC für alle historischen Zeiten zu verwenden (dh Ereignisse wurden aufgezeichnet). Es ist immer möglich, von UTC zur Ortszeit zu wechseln, aber nicht immer umgekehrt.
Wann sollte die Ortszeit verwendet werden? Beantworte diese Frage:
Speichern Sie die Ortszeit nur, wenn die Antwort "Ja" lautet. Offensichtlich gilt dies nur für zukünftige Daten und normalerweise nur für Daten, die Personen in irgendeiner Weise betreffen.
Warum eine Zeitzone / einen Versatz speichern?
Erstens, wenn Sie aufzeichnen möchten, wie hoch der Versatz für den Benutzer war, der die Aktion ausgeführt hat, ist es wahrscheinlich am besten, dies einfach zu tun, dh beim Anmelden den Ort und die Zeitzone für diesen Benutzer aufzuzeichnen.
Zweitens, wenn Sie für die Anzeige konvertieren möchten, benötigen Sie eine Tabelle aller lokalen Zeitversatzübergänge für diese Zeitzone. Es reicht nicht aus, nur den aktuellen Versatz zu kennen, denn wenn Sie ein Datum / eine Uhrzeit von vor sechs Monaten anzeigen, wird der Versatz angezeigt Sei anders.
quelle
Mit einem DATETIMEOFFSET können Sie die Ortszeit und die UTC-Zeit in einem Feld speichern.
Dies ermöglicht eine sehr einfache und effiziente Berichterstellung in lokaler oder UTC-Zeit, ohne dass die Daten für die Anzeige in irgendeiner Weise verarbeitet werden müssen.
Dies sind die beiden häufigsten Anforderungen - Ortszeit für lokale Berichte und UTC-Zeit für Gruppenberichte.
Die Ortszeit wird im DATETIME-Teil des DATETIMEOFFSET gespeichert, und der OFFSET von UTC wird im OFFSET-Teil gespeichert. Die Konvertierung ist daher einfach und kann auf Datenbankebene durchgeführt werden, da keine Kenntnis der Zeitzone erforderlich ist, aus der die Daten stammen .
Wenn Sie keine Zeiten bis zu Millisekunden benötigen, z. B. nur Minuten oder Sekunden, können Sie DATETIMEOFFSET (0) verwenden. Das Feld DATETIMEOFFSET benötigt dann nur 8 Byte Speicher - genau wie ein DATETIME.
Die Verwendung eines DATETIMEOFFSET anstelle eines UTC-DATETIME bietet daher mehr Flexibilität, Effizienz und Einfachheit für die Berichterstellung.
quelle