Ich hoffe, diese Frage und die Antworten darauf zum endgültigen Leitfaden für den Umgang mit der Sommerzeit zu machen, insbesondere für den Umgang mit den tatsächlichen Umstellungen.
Wenn Sie etwas hinzufügen möchten, tun Sie dies bitte
Viele Systeme sind darauf angewiesen, die genaue Zeit einzuhalten. Das Problem besteht darin, dass sich die Zeit aufgrund der Sommerzeit ändert und die Uhr vorwärts oder rückwärts bewegt wird.
Zum Beispiel hat man Geschäftsregeln in einem Auftragsannahmesystem, die von der Zeit der Bestellung abhängen - wenn sich die Uhr ändert, sind die Regeln möglicherweise nicht so klar. Wie soll der Zeitpunkt der Bestellung beibehalten werden? Es gibt natürlich unendlich viele Szenarien - diese ist nur eine veranschaulichende.
- Wie sind Sie mit dem Problem der Sommerzeit umgegangen?
- Welche Annahmen sind Teil Ihrer Lösung? (hier nach Kontext suchen)
Ebenso wichtig, wenn nicht noch wichtiger:
- Was hast du versucht, das hat nicht funktioniert?
- Warum hat es nicht funktioniert?
Ich würde mich für Programmierung, Betriebssystem, Datenpersistenz und andere relevante Aspekte des Problems interessieren.
Allgemeine Antworten sind großartig, aber ich würde auch gerne Details sehen, insbesondere wenn sie nur auf einer Plattform verfügbar sind.
GETDATE()
unter SQL ist UTC (wie auchDateTime.Now
). Und der Server wird durch keine automatischen Sommerzeitänderungen beeinflusst.DateTime.UtcNow
undGETUTCDATE()
es zeigt auch andere Entwickler, dass Sie tatsächlich darüber nachgedacht habenAntworten:
Zusammenfassung der Antworten und anderer Daten: (bitte fügen Sie Ihre hinzu)
Tun:
datetimeoffset
Typ, der beide in einem einzigen Feld speichern kann.1970-01-01T00:00:00Z
(ohne Schaltsekunden). Wenn Sie eine höhere Genauigkeit benötigen, verwenden Sie stattdessen Millisekunden. Dieser Wert sollte immer auf UTC basieren, ohne Zeitzonenanpassung.DateTimeOffset
ist dies häufig die bessere Wahl alsDateTime
.DateTime
undDateTimeZone
Klassen bereitgestellten nativen Zeitzonenkonvertierungen . Seien Sie vorsichtig bei der VerwendungDateTimeZone::listAbbreviations()
- siehe Antwort . Installieren Sie regelmäßig das PECL-Paket timezonedb, um PHP mit den aktuellen Olson-Daten auf dem neuesten Stand zu halten . siehe Antwort .>=
,<
) ab.Nicht:
America/New_York
mit einem "Zeitzonenversatz", z-05:00
. Das sind zwei verschiedene Dinge. Siehe das Zeitzonen-Tag-Wiki .Date
Objekt nicht, um Datums- und Zeitberechnungen in älteren Webbrowsern durchzuführen, da ECMAScript 5.1 und niedriger einen Konstruktionsfehler aufweist , bei dem die Sommerzeit möglicherweise falsch verwendet wird. (Dies wurde in ECMAScript 6/2015 behoben).Testen:
Referenz:
timezone
Tag-Wiki-Seite zum Stapelüberlaufdst
timezone
Andere:
quelle
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:
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
Offsets und Namen
Ein Beispiel für das Obige wäre:
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:
Ok, ich denke ich bin fertig.
quelle
DateTimeOffset
(oder gleichwertig) nützlich. Ansonsten gut aufschreiben.Dies ist ein wichtiges und überraschend schwieriges Thema. Die Wahrheit ist, dass es keinen völlig zufriedenstellenden Standard für die Dauer der Zeit gibt. Zum Beispiel reichen der SQL-Standard und das ISO-Format (ISO 8601) eindeutig nicht aus.
Aus konzeptioneller Sicht werden normalerweise zwei Arten von Zeit-Datum-Daten behandelt, und es ist zweckmäßig, sie zu unterscheiden (die oben genannten Standards nicht): " physische Zeit " und " bürgerliche Zeit ".
Ein "physischer" Zeitpunkt ist ein Punkt in der kontinuierlichen universellen Zeitachse, mit dem sich die Physik befasst (natürlich ohne Berücksichtigung der Relativitätstheorie). Dieses Konzept kann beispielsweise in UTC ausreichend codiert und beibehalten werden (wenn Sie Schaltsekunden ignorieren können).
Eine "zivile" Zeit ist eine Datums- / Uhrzeitspezifikation, die zivilen Normen folgt: Ein Zeitpunkt wird hier vollständig durch eine Reihe von Datums- / Uhrzeitfeldern (Y, M, D, H, MM, S, FS) plus eine TZ (Zeitzonenspezifikation) spezifiziert. (eigentlich auch ein "Kalender"; aber nehmen wir an, wir beschränken die Diskussion auf den Gregorianischen Kalender). Eine Zeitzone und ein Kalender ermöglichen (im Prinzip) die Zuordnung von einer Darstellung zur anderen. Aber zivile und physische Zeitpunkte sind grundsätzlich unterschiedliche Arten von Größen, und sie sollten konzeptionell getrennt gehalten und unterschiedlich behandelt werden (eine Analogie: Arrays von Bytes und Zeichenketten).
Das Problem ist verwirrend, weil wir austauschbar von solchen Ereignissen sprechen und weil die bürgerlichen Zeiten politischen Veränderungen unterliegen. Das Problem (und die Notwendigkeit, diese Konzepte zu unterscheiden) wird für zukünftige Ereignisse offensichtlicher. Beispiel (aus meiner Diskussion hier entnommen .
John zeichnet in seinem Kalender eine Erinnerung für ein Ereignis zur Datumszeit auf
2019-Jul-27, 10:30:00
, TZ =Chile/Santiago
(das GMT-4 versetzt hat, daher entspricht es UTC2019-Jul-27 14:30:00
). Aber eines Tages in der Zukunft beschließt das Land, den TZ-Offset auf GMT-5 zu ändern.Nun, wenn der Tag kommt ... sollte diese Erinnerung bei auslösen
A)
2019-Jul-27 10:30:00 Chile/Santiago
=UTC time 2019-Jul-27 15:30:00
?oder
B)
2019-Jul-27 9:30:00 Chile/Santiago
=UTC time 2019-Jul-27 14:30:00
?Es gibt keine richtige Antwort, es sei denn, man weiß, was John konzeptionell meinte, als er dem Kalender sagte "Bitte ruf mich an
2019-Jul-27, 10:30:00 TZ=Chile/Santiago
".Meinte er eine "bürgerliche Datumszeit" ("wenn die Uhren in meiner Stadt 10:30 anzeigen")? In diesem Fall ist A) die richtige Antwort.
Oder meinte er einen "physischen Moment der Zeit", einen Punkt in der Kontinuumslinie unseres Universums, sagen wir "wenn die nächste Sonnenfinsternis passiert". In diesem Fall ist Antwort B) die richtige.
Einige Datums- / Zeit-APIs machen diese Unterscheidung richtig: Unter ihnen Jodatime , die die Grundlage für die nächste (dritte!) Java DateTime-API (JSR 310) bildet.
quelle
Machen Sie eine klare architektonische Trennung von Bedenken - um genau zu wissen, welche Ebene mit Benutzern interagiert und Datum und Uhrzeit für / von der kanonischen Darstellung (UTC) ändern muss. Nicht-UTC-Datum-Uhrzeit ist eine Darstellung (folgt der lokalen Zeitzone des Benutzers), UTC-Zeit ist ein Modell (bleibt für Back-End- und Mid-Tiers eindeutig).
Entscheiden Sie auch, was Ihr tatsächliches Publikum ist, was Sie nicht bedienen müssen und wo Sie die Grenze ziehen . Berühren Sie keine exotischen Kalender, es sei denn, Sie haben tatsächlich wichtige Kunden dort und ziehen Sie dann separate benutzerbezogene Server nur für diese Region in Betracht.
Wenn Sie den Standort des Benutzers erfassen und verwalten können, verwenden Sie den Standort für die systematische Konvertierung von Datum und Uhrzeit (z. B. .NET-Kultur oder eine SQL-Tabelle), bieten Sie dem Endbenutzer jedoch die Möglichkeit, Überschreibungen auszuwählen, wenn die Datums- und Uhrzeit für Ihre Benutzer kritisch ist.
Wenn es sich um historische Prüfungsverpflichtungen handelt (z. B. um genau zu sagen, wann Jo in AZ vor 2 Jahren im September eine Rechnung bezahlt hat), behalten Sie sowohl die UTC- als auch die Ortszeit für die Aufzeichnung bei (Ihre Umrechnungstabellen ändern sich im Laufe der Zeit).
Definieren Sie die zeitreferenzielle Zeitzone für Daten, die in großen Mengen vorliegen - wie Dateien, Webdienste usw. Angenommen, das Unternehmen an der Ostküste verfügt über ein Rechenzentrum in CA - Sie müssen fragen und wissen, was sie als Standard verwenden, anstatt das eine oder andere anzunehmen.
Vertrauen Sie keinen Zeitzonen-Offsets, die in die Textdarstellung der Datums- und Uhrzeitangabe eingebettet sind, und akzeptieren Sie nicht, diese zu analysieren und zu befolgen. Fordern Sie stattdessen immer an, dass Zeitzone und / oder Referenzzone explizit definiert werden müssen . Sie können problemlos Zeit mit PST-Offset empfangen, aber die Zeit ist tatsächlich EST, da dies die Referenzzeit des Clients ist und die Datensätze gerade auf einem Server exportiert wurden, der sich in PST befindet.
quelle
Sie müssen über die Olson tz-Datenbank Bescheid wissen , die unter
ftp://elsie.nci.nih.gov/pubhttp://iana.org/time-zones/ verfügbar ist . Es wird mehrmals pro Jahr aktualisiert, um die häufig in letzter Minute vorgenommenen Änderungen zu berücksichtigen, wann (und ob) in verschiedenen Ländern der Welt zwischen Winter- und Sommerzeit (Standard- und Sommerzeit) umgeschaltet werden soll. Im Jahr 2009 war die letzte Veröffentlichung 2009; im Jahr 2010 war es 2010n; im Jahr 2011 war es 2011n; Ende Mai 2012 war die Veröffentlichung 2012c. Beachten Sie, dass in zwei separaten Archiven (tzcode20xxy.tar.gz und tzdata20xxy.tar.gz) eine Reihe von Codes zum Verwalten der Daten und der tatsächlichen Zeitzonendaten selbst vorhanden sind. Sowohl Code als auch Daten sind gemeinfrei.Dies ist die Quelle für Zeitzonennamen wie America / Los_Angeles (und Synonyme wie US / Pacific).
Wenn Sie verschiedene Zonen im Auge behalten müssen, benötigen Sie die Olson-Datenbank. Wie andere empfohlen haben, möchten Sie die Daten auch in einem festen Format speichern - normalerweise wird UTC ausgewählt -, zusammen mit einer Aufzeichnung der Zeitzone, in der die Daten generiert wurden. Möglicherweise möchten Sie zwischen dem Versatz von UTC zum Zeitpunkt und dem Namen der Zeitzone unterscheiden. das kann später einen Unterschied machen. Wenn Sie wissen, dass es sich derzeit um 2010-03-28T23: 47: 00-07: 00 (US / Pazifik) handelt, können Sie möglicherweise auch den Wert 2010-11-15T12: 30 interpretieren, der vermutlich in PST angegeben ist ( Pacific Standard Time) anstelle von PDT (Pacific Daylight Saving Time).
Die Standardschnittstellen der C-Bibliothek sind bei solchen Dingen nicht besonders hilfreich.
Die Olson-Daten wurden verschoben, zum Teil, weil AD Olson bald in den Ruhestand geht, und zum Teil, weil gegen die Betreuer eine (inzwischen abgewiesene) Klage wegen Urheberrechtsverletzung erhoben wurde. Die Zeitzonendatenbank wird jetzt unter der Schirmherrschaft von IANA , der Internet Assigned Numbers Authority, verwaltet. Auf der Startseite befindet sich ein Link zu "Zeitzonendatenbank" . Die Diskussions-Mailingliste ist jetzt
[email protected]
; Die Ankündigungsliste ist[email protected]
.quelle
zic.8
Manpage (oderzic.8.txt
). Sie benötigen dietzcode2011i.tar.gz
Datei anstelle oder ebenso wie dietzdata2011i.tar.gz
Datei, um diese Informationen zu erhalten.Nehmen Sie im Allgemeinen den lokalen Zeitversatz (einschließlich des DST-Versatzes) in gespeicherte Zeitstempel auf: UTC allein reicht nicht aus, wenn Sie den Zeitstempel später in seiner ursprünglichen Zeitzone (und DST-Einstellung) anzeigen möchten.
Beachten Sie, dass der Offset nicht immer eine ganzzahlige Anzahl von Stunden ist (z. B. ist die indische Standardzeit UTC + 05: 30).
Geeignete Formate sind beispielsweise ein Tupel (Unix-Zeit, Offset in Minuten) oder ISO 8601 .
quelle
Das Überschreiten der Grenze zwischen "Computerzeit" und "Menschenzeit" ist ein Albtraum. Das wichtigste ist, dass es keinen Standard für die Regeln für Zeitzonen und Sommerzeit gibt. Den Ländern steht es jederzeit frei, ihre Zeitzonen- und Sommerzeitregeln zu ändern.
Einige Länder, z. B. Israel, Brasilien, entscheiden jedes Jahr, wann die Sommerzeit sein soll. Daher ist es unmöglich, im Voraus zu wissen, wann (wenn) die Sommerzeit in Kraft tritt. Andere haben feste (ish) Regeln, wann die Sommerzeit in Kraft ist. Andere Länder verwenden die Sommerzeit nicht wie alle.
Zeitzonen müssen keine vollen Stundenunterschiede zu GMT sein. Nepal ist +5,45. Es gibt sogar Zeitzonen mit +13. Das bedeutet, dass:
sind alle zur gleichen Zeit, aber 3 verschiedene Tage!
Es gibt auch keinen klaren Standard für die Abkürzungen für Zeitzonen und wie sie sich in der Sommerzeit ändern, sodass Sie am Ende folgende Dinge erhalten:
Der beste Rat ist, sich so weit wie möglich von der Ortszeit fernzuhalten und sich an UTC zu halten, wo Sie können. Konvertieren Sie nur zum letztmöglichen Zeitpunkt in Ortszeiten.
Stellen Sie beim Testen sicher, dass Sie Länder in der westlichen und östlichen Hemisphäre testen, wobei sowohl die Sommerzeit läuft als auch nicht und ein Land, in dem die Sommerzeit nicht verwendet wird (insgesamt 6).
quelle
Für PHP:
Die DateTimeZone-Klasse in PHP> 5.2 basiert bereits auf der Olson-Datenbank, die von anderen erwähnt wird. Wenn Sie also Zeitzonenkonvertierungen in PHP und nicht in der Datenbank durchführen, können Sie nicht mit (schwer verständlichen) Olson-Dateien arbeiten.
PHP wird jedoch nicht so häufig aktualisiert wie die Olson-Datenbank. Wenn Sie also nur die Zeitzonen-Konvertierungen von PHP verwenden, erhalten Sie möglicherweise veraltete Sommerzeitinformationen und können die Richtigkeit Ihrer Daten beeinflussen. Es wird zwar nicht häufig erwartet, dass dies häufig vorkommt, dies kann jedoch vorkommen , wenn Sie eine große Anzahl von Benutzern weltweit haben.
Verwenden Sie das timezonedb pecl-Paket, um das oben genannte Problem zu beheben . Seine Funktion besteht darin, die Zeitzonendaten von PHP zu aktualisieren. Installieren Sie dieses Paket so oft, wie es aktualisiert wird. (Ich bin nicht sicher, ob die Updates für dieses Paket genau den Olson-Updates folgen, aber es scheint mit einer Häufigkeit aktualisiert zu werden, die zumindest sehr nahe an der Häufigkeit der Olson-Updates liegt.)
quelle
Wenn Ihr Design dies zulässt, vermeiden Sie die lokale Zeitumrechnung insgesamt!
Ich weiß, dass dies für manche vielleicht verrückt klingt, aber denken Sie an UX: Benutzer verarbeiten nahe relative Daten (heute, gestern, nächsten Montag) schneller als absolute Daten (2010.09.17, Freitag, 17. September) auf einen Blick. Und wenn Sie mehr darüber nachdenken, ist die Genauigkeit der Zeitzonen (und der Sommerzeit) umso wichtiger, je näher das Datum liegt.
now()
Wenn Sie also Datums- / Datumsangaben in einem relativen Format für +/- 1 oder 2 Wochen ausdrücken können, ist der Rest von Die Daten können UTC sein und es wird 95% der Benutzer nicht allzu wichtig sein.Auf diese Weise können Sie alle Daten in UTC speichern und die relativen Vergleiche in UTC durchführen und dem Benutzer einfach UTC-Daten außerhalb Ihres relativen Datumsschwellenwerts anzeigen.
Dies kann auch für Benutzereingaben gelten (im Allgemeinen jedoch eingeschränkter). Die Auswahl aus einer Dropdown-Liste mit nur {Gestern, Heute, Morgen, Nächsten Montag, Nächsten Donnerstag} ist für den Benutzer so viel einfacher und einfacher als eine Datumsauswahl. Dattelpflücker sind einige der schmerzauslösendsten Bestandteile des Formularfüllens. Natürlich funktioniert dies nicht in allen Fällen, aber Sie können sehen, dass nur ein wenig cleveres Design erforderlich ist, um es sehr leistungsfähig zu machen.
quelle
Obwohl ich es noch nicht ausprobiert habe, wäre ein Ansatz für Zeitzonenanpassungen, den ich als überzeugend empfinden würde, wie folgt:
Speichern Sie alles in UTC.
Erstellen Sie eine Tabelle
TZOffsets
mit drei Spalten: RegionClassId, StartDateTime und OffsetMinutes (int, in Minuten).In der Tabelle speichert eine Liste von Daten und Zeiten , wenn die lokale Zeit verändert, und um wie viel. Die Anzahl der Regionen in der Tabelle und die Anzahl der Daten hängen davon ab, welche Datumsbereiche und Regionen der Welt Sie unterstützen müssen. Stellen Sie sich das so vor, als wäre es ein "historisches" Datum, obwohl die Daten die Zukunft bis zu einer praktischen Grenze einschließen sollten.
Wenn Sie die Ortszeit einer UTC-Zeit berechnen müssen, gehen Sie wie folgt vor:
Möglicherweise möchten Sie diese Tabelle in Ihrer App zwischenspeichern und LINQ oder ein ähnliches Mittel verwenden, um die Abfragen auszuführen, anstatt auf die Datenbank zuzugreifen.
Diese Daten können aus der gemeinfreien tz-Datenbank destilliert werden .
Vorteile und Fußnoten dieses Ansatzes:
Der einzige Nachteil dieses oder eines anderen Ansatzes besteht darin, dass die Umrechnungen von der Ortszeit zu GMT nicht perfekt sind, da jede DST-Änderung, die einen negativen Versatz zur Uhr aufweist, eine bestimmte Ortszeit wiederholt . Ich fürchte, es gibt keine einfache Möglichkeit, damit umzugehen. Dies ist einer der Gründe, warum das Speichern von Ortszeiten in erster Linie eine schlechte Nachricht ist.
quelle
Ich hatte kürzlich ein Problem in einer Webanwendung, bei der bei einem Ajax-Post-Back die Datums- / Uhrzeitangabe, die zu meinem serverseitigen Code zurückkehrte, sich von der Datums- / Uhrzeitangabe unterschied.
Dies hatte höchstwahrscheinlich mit meinem JavaScript-Code auf dem Client zu tun, der das Datum für die Rücksendung als Zeichenfolge an den Client festlegte, da JavaScript die Zeitzone und die Sommerzeit anpasste und in einigen Browsern berechnet wurde, wann die Sommerzeit angewendet werden soll schien anders zu sein als bei anderen.
Am Ende habe ich mich dafür entschieden, Datums- und Zeitberechnungen auf dem Client vollständig zu entfernen und sie mit einem Ganzzahlschlüssel auf meinen Server zurückzusenden, der dann auf dem Server in Datum und Uhrzeit übersetzt wurde, um konsistente Transformationen zu ermöglichen.
Ich lerne daraus: Verwenden Sie in Webanwendungen keine JavaScript-Datums- und Zeitberechnungen, es sei denn, Sie müssen dies ABSOLUT tun.
quelle
Ich habe dies bei zwei Arten von Systemen festgestellt: „Schichtplanungssysteme (z. B. Fabrikarbeiter)“ und „gasabhängige Managementsysteme)…
23 und 25 Stunden lange Tage sind ein Schmerz, mit dem man fertig werden muss, ebenso wie 8-Stunden-Schichten, die 7 Stunden oder 9 Stunden dauern. Das Problem ist, dass Sie feststellen werden, dass jeder Kunde oder sogar jede Abteilung des Kunden unterschiedliche Regeln hat (oft ohne zu dokumentieren), was sie in diesen speziellen Fällen tun.
Einige Fragen werden dem Kunden am besten erst gestellt, nachdem er für Ihre Standard-Software bezahlt hat. Es ist sehr selten, dass ein Kunde beim Kauf von Software im Voraus über diese Art von Problem nachdenkt.
Ich denke in jedem Fall sollten Sie die Zeit in UTC aufzeichnen und in / von der Ortszeit konvertieren, bevor Sie das Datum / die Uhrzeit speichern. Selbst wenn Sie wissen, in welcher Zeit sich eine bestimmte Zeit befindet, kann dies mit Sommerzeit und Zeitzonen schwierig sein.
quelle
Für das Web sind die Regeln nicht so kompliziert ...
Der Rest ist nur eine UTC / lokale Konvertierung unter Verwendung Ihrer serverseitigen Datetime-Bibliotheken. Gut zu gehen ...
quelle
Wenn es um Anwendungen geht, die auf einem Server ausgeführt werden , einschließlich Websites und anderer Back-End-Dienste, sollte die Zeitzoneneinstellung des Servers von der Anwendung ignoriert werden.
Es wird allgemein empfohlen, die Zeitzone des Servers auf UTC einzustellen. Dies ist in der Tat eine gute bewährte Methode, dient jedoch als Pflaster für Anwendungen, die nicht anderen bewährten Methoden folgen. Beispielsweise schreibt ein Dienst möglicherweise in Protokolldateien mit lokalen Zeitstempeln anstelle von UTC-basierten Zeitstempeln, wodurch während des Fallback-Übergangs zur Sommerzeit Mehrdeutigkeiten entstehen. Wenn Sie die Zeitzone des Servers auf UTC einstellen , wird diese Anwendung behoben . Die eigentliche Lösung wäre jedoch, dass die Anwendung zunächst mit UTC protokolliert.
Serverseitiger Code, einschließlich Websites, sollte niemals erwarten , dass die lokale Zeitzone des Servers etwas Besonderes ist.
In einigen Sprachen kann sich die lokale Zeitzone leicht in den Anwendungscode einschleichen. Beispielsweise wird die
DateTime.ToUniversalTime
Methode in .NET von der lokalen Zeitzone in UTC konvertiert , und dieDateTime.Now
Eigenschaft gibt die aktuelle Zeit in der lokalen Zeitzone zurück. Auch dieDate
Konstruktor in JavaScript die lokale Zeitzone des Computers. Es gibt viele andere Beispiele dafür. Es ist wichtig, die defensive Programmierung zu üben und jeglichen Code zu vermeiden, der die lokale Zeitzoneneinstellung des Computers verwendet.Reservieren Sie mithilfe der lokalen Zeitzone für clientseitigen Code, z. B. Desktopanwendungen, mobile Anwendungen und clientseitiges JavaScript.
quelle
Halten Sie Ihre Server auf UTC eingestellt und stellen Sie sicher, dass sie alle für ntp oder gleichwertig konfiguriert sind.
UTC vermeidet Probleme mit der Sommerzeit, und nicht synchronisierte Server können zu unvorhersehbaren Ergebnissen führen, deren Diagnose eine Weile dauert.
quelle
Seien Sie vorsichtig, wenn Sie mit Zeitstempeln umgehen, die im FAT32-Dateisystem gespeichert sind - diese werden immer in lokalen Zeitkoordinaten beibehalten (einschließlich Sommerzeit - siehe msdn-Artikel ). Wurde daran verbrannt.
quelle
Stellen Sie außerdem sicher, dass auf den Servern der aktuelle Sommerzeit-Patch angewendet wird.
Wir hatten letztes Jahr eine Situation, in der unsere Zeiten für nordamerikanische Benutzer drei Wochen lang konstant um eine Stunde abgelaufen waren, obwohl wir ein UTC-basiertes System verwendeten.
Es stellte sich am Ende heraus, dass es die Server waren. Sie brauchten lediglich einen aktuellen Patch ( Windows Server 2003 ).
quelle
PHP-
DateTimeZone::listAbbreviations()
AusgabeDiese PHP-Methode gibt ein assoziatives Array zurück, das einige "Haupt" -Zeitzonen (wie CEST) enthält, die für sich genommen spezifischere "geografische" Zeitzonen (wie Europa / Amsterdam) enthalten.
Wenn Sie diese Zeitzonen und ihre Offset- / Sommerzeitinformationen verwenden, ist es äußerst wichtig, Folgendes zu beachten:
Es scheint, dass alle unterschiedlichen Offset- / DST-Konfigurationen (einschließlich historischer Konfigurationen) jeder Zeitzone enthalten sind!
Zum Beispiel kann Europa / Amsterdam sechsmal in der Ausgabe dieser Funktion gefunden werden. Zwei Vorkommen (Offset 1172/4772) werden für die Amsterdamer Zeit bis 1937 verwendet; zwei (1200/4800) sind für die Zeit, die zwischen 1937 und 1940 verwendet wurde; und zwei (3600/4800) sind für die seit 1940 verwendete Zeit.
Daher können Sie sich nicht darauf verlassen, dass die von dieser Funktion zurückgegebenen Offset- / Sommerzeitinformationen aktuell korrekt sind / verwendet werden!
Wenn Sie den aktuellen Offset / die aktuelle Sommerzeit einer bestimmten Zeitzone wissen möchten, müssen Sie Folgendes tun:
quelle
Wenn Sie Datenbanksysteme warten, auf denen die Sommerzeit aktiv ist, prüfen Sie sorgfältig, ob sie während des Übergangs im Herbst heruntergefahren werden müssen. Mandy DBS (oder auch andere Systeme) mögen es nicht, denselben Punkt in (lokaler) Zeit zweimal zu übergeben. Genau das passiert, wenn Sie die Uhr im Herbst zurückdrehen. SAP hat dies mit einer (meiner Meinung nach wirklich netten) Problemumgehung gelöst - anstatt die Uhr zurückzudrehen, ließ man die interne Uhr einfach zwei Stunden lang mit der halben Geschwindigkeit laufen ...
quelle
Verwenden Sie das .NET Framework ? Wenn ja, möchte ich Ihnen den DateTimeOffset- Typ vorstellen , der mit .NET 3.5 hinzugefügt wurde.
Diese Struktur enthält sowohl a
DateTime
als auch einen Offset (TimeSpan
), der die Differenz zwischenDateTimeOffset
Datum und Uhrzeit der Instanz und der koordinierten Weltzeit (UTC) angibt .Die
DateTimeOffset.Now
statische Methode gibt eineDateTimeOffset
Instanz zurück, die aus der aktuellen (lokalen) Zeit und dem lokalen Offset besteht (wie in den regionalen Informationen des Betriebssystems definiert).Die
DateTimeOffset.UtcNow
statische Methode gibt eineDateTimeOffset
Instanz zurück, die aus der aktuellen Zeit in UTC besteht (als wären Sie in Greenwich).Andere hilfreiche Typen sind die Klassen TimeZone und TimeZoneInfo .
quelle
Wenn Sie in .NET damit zu kämpfen haben, prüfen Sie , ob sich die Verwendung
DateTimeOffset
und / oder die MüheTimeZoneInfo
lohnt.Wenn Sie verwenden möchten IANA / Olson-Zeitzonen verwenden oder feststellen, dass die integrierten Typen für Ihre Anforderungen nicht ausreichen, lesen Sie Noda Time , eine viel intelligentere API für Datum und Uhrzeit für .NET.
quelle
Geschäftsregeln sollten immer in ziviler Zeit funktionieren (es sei denn, es gibt Gesetze, die etwas anderes vorschreiben). Seien Sie sich bewusst, dass bürgerliche Zeit ein Chaos ist, aber es ist das, was die Leute benutzen, also ist es das, was wichtig ist.
Bewahren Sie Zeitstempel intern in einer Zeitspanne von Sekunden auf. Die Epoche spielt keine besondere Rolle (ich bevorzuge die Unix-Epoche ), aber sie macht die Dinge einfacher als die Alternative. Stellen Sie sich vor, dass Schaltsekunden nur existieren, wenn Sie etwas tun, das sie wirklich benötigt (z. B. Satellitenortung). Die Zuordnung zwischen Zeitstempeln und angezeigter Zeit ist der einzige Punkt, an dem DST- Regeln angewendet werden sollten. Die Regeln ändern sich häufig (auf globaler Ebene mehrmals im Jahr; beschuldigen Sie Politiker), daher sollten Sie sicherstellen, dass Sie das Mapping nicht fest codieren. Olsons TZ-Datenbank ist von unschätzbarem Wert.
quelle
Ich wollte nur auf zwei Dinge hinweisen, die ungenau oder zumindest verwirrend erscheinen:
Für (fast) alle praktischen Computerzwecke ist UTC tatsächlich GMT. Wenn Sie keine Zeitstempel mit einem Bruchteil einer Sekunde sehen, handelt es sich um GMT, wodurch diese Unterscheidung überflüssig wird.
Ein Zeitstempel wird immer in GMT dargestellt und hat daher keinen Versatz.
quelle
Hier ist meine Erfahrung: -
(Benötigt keine Bibliothek eines Drittanbieters)
quelle
getTimezoneOffset
Gibt den Offset für das Datum und die Uhrzeit zurück, zu der Sie ihn aufrufen. Dieser Versatz kann sich ändern, wenn eine Zeitzone in die Sommerzeit oder aus dieser heraus wechselt. Siehe "Zeitzone! = Versatz" im Zeitzonen-Tag-Wiki .Tom Scotts Video über Zeitzonen auf YouTube im Computerphile-Kanal enthält auch eine schöne und unterhaltsame Beschreibung des Themas. Beispiele beinhalten:
quelle
Tatsächlich exportiert kernel32.dll SystemTimeToTzSpecificLocation nicht. Es werden jedoch die folgenden zwei exportiert: SystemTimeToTzSpecificLocalTime und TzSpecificLocalTimeToSystemTime ...
quelle
Verlassen Sie sich niemals nur auf Konstrukteure wie
Sie können Ausnahmen auslösen, wenn aufgrund der Sommerzeit eine bestimmte Datums- / Uhrzeit nicht vorhanden ist. Erstellen Sie stattdessen Ihre eigenen Methoden zum Erstellen solcher Daten. Fangen Sie in ihnen alle Ausnahmen ab, die aufgrund der Sommerzeit auftreten, und passen Sie die benötigte Zeit mit dem Übergangsversatz an. Die Sommerzeit kann je nach Zeitzone zu unterschiedlichen Daten und zu unterschiedlichen Zeiten (für Brasilien sogar um Mitternacht) auftreten.
quelle
Nur ein Beispiel, um zu beweisen, dass die Bearbeitungszeit das beschriebene große Durcheinander ist und dass Sie niemals selbstgefällig sein können. An mehreren Stellen auf dieser Seite wurden Schaltsekunden ignoriert.
Vor einigen Jahren verwendete das Android-Betriebssystem GPS-Satelliten, um eine UTC-Zeitreferenz zu erhalten, ignorierte jedoch die Tatsache, dass GPS-Satelliten keine Schaltsekunden verwenden. Niemand bemerkte es, bis es an Silvester Verwirrung gab, als die Apple-Telefonbenutzer und Android-Telefonbenutzer ihre Countdowns im Abstand von etwa 15 Sekunden durchführten.
Ich denke, es wurde inzwischen behoben, aber Sie wissen nie, wann diese "kleinen Details" zurückkommen werden, um Sie zu verfolgen.
quelle
struct tm
in C.¹¹ Einige Implementierungen von
struct tm
do speichern den UTC-Offset, dies hat es jedoch nicht zum Standard gemacht.quelle
Beim Umgang mit Datenbanken (insbesondere MySQL , dies gilt jedoch für die meisten Datenbanken) fiel es mir schwer, UTC zu speichern.
Ich fand es einfacher, nur die Server-Datumszeit in der Datenbank zu speichern und dann die gespeicherte Datumszeit in den SQL-Anweisungen wieder in UTC (dh UNIX_TIMESTAMP ()) konvertieren zu lassen. Danach können Sie die datetime als UTC in Ihrem Code verwenden.
Wenn Sie 100% Kontrolle über den Server und den gesamten Code haben, ist es wahrscheinlich besser, die Server-Zeitzone auf UTC zu ändern.
quelle