Was ist ein geeigneter Datentyp zum speichern einer Zeitzone?
Ich überlege, einfach einen string im format "+hh:mm" (oder "-hh:mm"). Dies ist sowohl notwendig als auch ausreichend?
Beachten Sie: ich brauche nicht zu speichern das Datum oder die Zeit der Zeitzone.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider PostgreSQL nicht bieten eine time zone-Datentyp ist, so sollten Sie wahrscheinlich verwenden
text
.interval
scheint wie eine logische option, auf den ersten Blick, und es ist geeignet für einige Anwendungen. Jedoch nicht zu berücksichtigen Sommerzeit, noch macht es die Tatsache berücksichtigen, dass unterschiedliche Regionen in der gleichen UTC-offset haben verschiedene DST-Regeln.Gibt es nicht eine 1:1-Zuordnung von UTC-offset zurück auf die Zeitzone.
Zum Beispiel die Zeitzone für
Australia/Sydney
(New South Wales) istUTC+10
(EST
), oderUTC+11
(EDT
) während der Sommerzeit. Ja, das ist die gleiche AbkürzungEST
dass die USA verwendet; Zeit zone Abkürzungen sind nicht eindeutig, in der tzdata-Datenbank, weshalb die Pg hat dietimezone_abbreviations
Einstellung. Schlimmer noch, Brisbane (Queensland) ist mit fast der gleichen longditude und ist inUTC+10 EST
... aber keine Sommerzeit, deshalb ist es bei einer-1
offset zu New South Wales im New South Wales die Sommerzeit.(Update: Mehr kürzlich Australien hat eine
A
Präfix, so dass es verwendetAEST
als seine östlichen Staaten TZ Abkürzung, aberEST
undWST
bleiben in gemeinsame Nutzung).Verwirrend viel?
Wenn alles, was Sie brauchen, um zu speichern ist ein UTC-offset dann ein
interval
geeignet ist. Wenn Sie speichern möchten, eine Zeitzone, speichern Sie es alstext
. Es ist ein Schmerz, um zu validieren und zu konvertieren, Zeitzonen-offset im moment, aber zumindest ist es meistert mit DST."+hh:mm" und "- "hh:mm" nicht-Zeit-Zonen sind Sie UTC-offsets. Ein gutes format zu speichern, diese sind wie eine Ganzzahl mit dem offset in Minuten. Sie können auch Dinge wie
interval
aber das wird nur helfen, wenn Sie wollen, zu tun, Datums-Berechnungen direkt in PostgreSQL, wie in einer Abfrage, etc. In der Regel wenn Sie diese Berechnungen in einer anderen Sprache, und dann kommt es darauf an, dass die Sprache, wenn es unterstützt dieinterval
Typ gut und hat ein gutes Datum/Zeit-Bibliothek oder nicht. Aber das konvertieren einer Ganzzahl in eine Art voninterval
-wie z.B. die Art, wie Pythonstimedelta
sollte trivial sein, so würde ich persönlich nur speichern Sie Sie als integer.Zeitzonen haben Namen, und obwohl es gibt keine standardisierten Bezeichnungen für die Zeitzonen gibt es eine de-facto-standard in der "tz" oder "zoneinfo" - Datenbank, und das ist, Namen wie "Europe/Paris", "Amerika/New_York" oder "US/Pacific". Diese sollte als Zeichenfolgen gespeichert werden.
Windows verwendet eine völlig unterschiedliche Namen, wie "Romantik-Zeit" (nicht Fragen). Sie können speichern Sie Sie als auch strings, aber ich würde es vermeiden, diese Namen nicht verwendet werden, außerhalb von Windows, und die Namen, die keinen Sinn machen. Außerdem übersetzte Versionen von windows nutzen meist übersetzte Namen für diese Zeitzonen haben, macht es noch schlimmer.
Abkürzungen wie "PDT" und "EST" sind nicht verwendbar als Zeit-zone Namen, denn Sie sind nicht einzigartig. Es gibt vier (glaube ich, oder war es fünf?) verschiedenen Zeitzonen an alle "CST", das ist also nicht nutzbar.
Kurz: Für Zeitzonen, speichern den Namen als string. Für UTC-offsets, speichern Sie den offset in Minuten als eine vorzeichenbehaftete Ganzzahl.
In einer idealen Welt könnte man einen foreign key auf eine Reihe von bekannten Zeitzonen. Sie können etwas tun, schließen Sie diese mit Ansichten und domains.
Diese wiki-Tipp von David E. Wheleer erstellt eine Domäne, die getestet wird, für seine Gültigkeit als eine Zeitzone:
Es ist nützlich, um eine Liste der bekannten Zeitzonen, in dem Fall könnten Sie verzichten auf die domain und nur die Einschränkung erzwungen wird, in der eine Tabelle mit den bekannten timezone Namen (gewonnen aus der Sicht
pg_timezone_names
), Vermeidung der Notwendigkeit aussetzen, die domain woanders:Dann können Sie erzwingen Richtigkeit durch Fremdschlüssel:
vielleicht Intervall
In postgres können Sie schon gegossen jedem
TIMESTAMP
oderTIMESTAMPTZ
zu oder von einem benannten Zeitzone, so brauchen Sie nicht zu suchen, bis die Werte aus einer Tabelle. Sie können mit diesem Ausdruck direkt in einer check-Einschränkung, so dass Sie nicht brauchen zu erstellen eine Funktion für diese entweder:Wenn Sie versuchen, legen Sie einen Wert enthält keinen gültigen Zeitzone, erhalten Sie einen Fehler, ist eigentlich Recht benutzerfreundlich:
Je nach Ihren Anforderungen, Sie könnte müssen Fehler werden in das format, dass ein normaler constraint-Verletzung würde Ihnen aber in vielen Fällen wird dies reichen.
Wenn Sie ein web-framework, das bietet Ihnen eine Liste von Zeitzonen, die Sie haben, in einer dropdown-box, dann ist diese Validierung sollte ausreichend sein, und dann Ihre check-Einschränkung ist nur eine Sicherung.