Was ist die beste Vorgehensweise zum Speichern von Zeitzonen in der Datenbank?

12

Wir möchten Zeitzonen für jede unserer Adressen in der Datenbank erfassen. Was ist die beste Vorgehensweise zum Speichern der Zeitzonen? Wie würden Sie Zeitzonen für die vorhandenen Adressdatensätze erfassen?

Ich verwende Microsoft SQL Server, .net mvc, C #. Anregungen wäre sehr dankbar.

Rodney
quelle
Übrigens ist es eine normale Zeitzone, ein int zu verwenden, aber einige Zeitzonen können + oder - 30 Minuten oder sogar 15 Minuten sein :) Oh und denken Sie daran, es ist keine exakte Wissenschaft, Sommerzeit und so kann Sie abschrecken.
Rocklan
2
@LachlanB Eine Möglichkeit ist, dass die Zeitzone eher ein Ort als ein Zeitversatz ist . Aber selbst diese Ansicht allein reicht nicht aus, z. B. hat Russland kürzlich seine Richtlinien zur Sommerzeit geändert, sodass Sie sie je nach aktuellem Datum unterschiedlich behandeln müssten.
Daniel B

Antworten:

7

Sie möchten etwas speichern, das sich nicht ständig ändert (oder zweimal im Jahr). Die Zeitzonendatenbank https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ist genau das Richtige. Sie speichern also nur zwei Buchstaben.

In dieser Datenbank können Sie den Zeitversatz abfragen und feststellen, wann die Sommerzeit aktiv ist. Es ist nicht nur der Zeitversatz, es gibt Ihnen auch einen Bereich, so dass viele Orte auf dem gleichen Breitengrad unterschiedliche Codes haben und ihre Zeitzonenregeln individuell ändern können und Ihre Software damit umgehen kann.

Das einzige Mal, wenn Sie Änderungen an Ihrer Datenbank vornehmen müssen, ist, wenn ein Standort die Zeitzone ändert, zu der er gehört, was sehr selten wäre.

gnasher729
quelle
Beachten Sie, dass die Liste auf Wikipedia nicht für alle IANA-Zeitzonen 2-stellige Abkürzungen enthält - außerdem ist die Zuordnung nicht eindeutig. Wenn Sie vollständige historische Informationen benötigen, wählen Sie stattdessen die vollständigen Namen.
Hulk
2
Die einzigen zwei Buchstabencodes, die ich auf der Wikipedia-Seite sehe, sind Ländercodes. Diese definieren Zeitzonen nicht eindeutig. Beispielsweise haben alle Zeitzonen in den USA denselben Ländercode mit zwei Buchstaben: US. Ebenso haben alle in ganz Australien den Ländercode AU.
Ian
3

Die absolut beste Vorgehensweise wäre die Verwendung einer Datenbank, die den TIMESTAMP WITH TIMEZONEvon SQL99 definierten Datentyp unterstützt .

SQL Server hat einen Typ namens datetimeoffset, der alles TIMESTAMP WITH TIMEZONEkann, außer die tatsächliche Zeitzone zu speichern. Sie können lediglich einen Versatz von UTC (z. B. 2013-05-04 12:34:56 -5:00) speichern. Dies bedeutet, dass Sie diesen vor dem Speichern anhand der Zeitzone ermitteln müssen.

Blrfl
quelle
3

Angenommen, Sie verwenden .NET Framework 4.0 oder höher, ist TimeZoneInfo genau das, was Sie brauchen.

Speichern Sie alle Datumswerte in der Datenbank im UTC-Format. Verwenden Sie entweder den ID-Wert oder das Ergebnis von ToSerializedString () für jeden Client, um ein TimeZoneInfo-Objekt zu erstellen und gespeicherte Daten zur Anzeige in das lokale Format zu konvertieren.

Wanderfalke
quelle
2

Sie haben gesagt, Sie möchten eine Zeitzone für jede Adresse in Ihrer Datenbank speichern, aber Sie haben nicht gesagt, was Sie damit machen möchten. Das Speichern von etwas in einer Datenbank ist selten ein Selbstzweck.

In jedem Fall würde ich versuchen, die TZ-Datenbank , auch bekannt als Olsen-Datenbank, entweder direkt oder mit einer Standard-Software zu verwenden, die TZ integriert. Sie können eine Zeitzone einfach als Zeichenfolge speichern, um auf einen der TZ DB-Einträge zu verweisen , z. B. "Afrika / Kampala" oder "Europa / Paris".

bdsl
quelle