2016-04-17 12 views
-1

Ich arbeite an einem System, das nur in einer einzigen Zeitzone verwendet wird, aber mit anderen Systemen integriert werden kann, die Daten und Uhrzeiten in utc aufdeckt, also dachten wir, dass wir alle gehen der Weg ebenso. Wir haben auch von vorher gehört, dass das Speichern Ihrer Zeiten in Utc sowieso der Weg ist, so dass es sich als der einfachste Weg erwies, Probleme zu minimieren. Vor kurzem sind wir jedoch in Schwierigkeiten geraten. Wir protokollieren Ereignisse im System, die für den Benutzer von Wert sind, so dass der Benutzer sie suchen und anzeigen kann. Schweden liegt in einer Zeitzone von +1, so dass ein Ereignis um 09:00 Uhr Ortszeit um 08:00 Uhr gespeichert wird. Wenn die Ereignisse dem Benutzer angezeigt werden, können wir sie erfolgreich in die lokale Zeit zurückverwandeln, bis vor Kurzem, als die Sommerzeit eingespielt wurde. Das Übersetzen von 0800 UTC in die lokale Zeit wird jetzt 2 Stunden hinzufügen. Das protokollierte Ereignis scheint nun um 10:00 Uhr stattgefunden zu haben. Wie soll ich damit umgehen? In diesem Fall, wo die gespeicherte Zeit dieselbe Zeit ist wie die Zeit, in der sie tatsächlich in db gespeichert wurde, konnte ich einfach das Datum ansehen und es anpassen, abhängig davon, ob dst zu dieser bestimmten Zeit ein- oder ausgeschaltet war. Ich denke jedoch, dass ich hierfür eine allgemeine Lösung benötige, da zu verschiedenen Zeiten (an anderen Stellen) im System Zeitstempel erstellt werden, die zukünftige und vergangene Zeitpunkte darstellen müssen. Für mich sieht es so aus, als hätte ich 2 Optionen. 1. Gehen Sie zurück zum Speichern lokaler Zeiten und tun Sie etwas zusätzliche Arbeit, wenn ich in andere Systeme integrieren, die utc verwenden, oder 2. zusammen mit jedem utc Zeitstempel einige Daten speichern, die mir sagen können, ob ein Zeitstempel während dst erstellt wurde oder nicht. Liege ich falsch? Recht? Etwas vermissen?UTC und DST für vergangene und zukünftige Ereignisse

+0

Normalerweise werden Zeitstempel als UTC-Zeitstempel + der Offset des Benutzers von UTC gespeichert, als der Zeitstempel erstellt wurde. Es erlaubt, alle Arten von intuitivem menschlichem Verhalten zu implementieren. –

+0

Das habe ich mir gedacht, aber ich habe noch nie eine Datenbank gesehen, in der jede Spalte mit Datum und Uhrzeit eine Offset-Spalte enthält, die mich glauben ließ, dass ich etwas übersehen habe. –

Antwort

0

Sie können den Client-Zeitzonen-Offset immer mit der -Methode abrufen. Jetzt müssen Sie diesen Zeitzonenversatz nur noch auf das in Ihrer Datenbank gespeicherte UTC-Datum anwenden und dem Endbenutzer das korrekte Datum anzeigen. Wenn Sie auf der anderen Seite den Zeitzonen-Offset anzeigen müssen, der vom Benutzer verwendet wurde, als das Ereignis in Ihrer Datenbank aufgezeichnet wurde, dann haben Sie definitiv eine zusätzliche Spalte in Ihrem DB, um diesen Offset aufzuzeichnen. Schwierig wird es, wenn Sie mit mehreren Zeitzonen umgehen wollen: Was passiert, wenn Sie einen Datensatz für einen Benutzer in Indien anzeigen möchten, der von einem Benutzer in Schweden eingereicht wurde?

+0

Vorsicht vor diesem Ansatz. Der Aufruf von "getTimezoneOffset" sollte zu dem spezifischen UTC-Datum und der Uhrzeit erfolgen. Es ist nur allzu üblich, dass man 'new Date(). GetTimezoneOffset()' aufruft und das Ergebnis auf einen beliebigen Wert anwendet, vergiss dabei, dass dies der * aktuelle * Offset ist, der sich von der fraglichen Zeit unterscheiden kann. –

0

Die Hauptsache, die Sie vermissen, ist, dass Sie nicht nur Schweden als +1 Zeitzone betrachten können. Eine Zeitzone und ein Zeitzonen-Offset sind zwei sehr unterschiedliche Dinge. Lesen Sie the timezone tag wiki für weitere Details zu diesem Thema.

Stattdessen können Sie eine der beiden folgenden Ansätze nehmen:

  1. Denken Sie an die Zeitzone in Bezug auf die es IANA tzdb identifier ist. Verwenden Sie für Schweden Europe/Stockholm. Führen Sie Ihre Conversions zwischen UTC und lokaler Zeit mit dieser Zeitzone aus, indem Sie eine Sprache, Bibliothek oder Plattform verwenden, die die tz-Datenbank implementiert.

  2. Anstatt herauszufinden, was die clientseitige Zeitzone ist, müssen Sie das clientseitige Betriebssystem verwenden, um die Konvertierungen in die lokale Zeit durchzuführen. Die meisten Umgebungen (einschließlich JavaScript in einem Webbrowser) können von UTC in lokale Zeit und umgekehrt umwandeln. Übertragen Sie mit diesem Ansatz nur UTC-Zeiten zwischen dem Client und dem Server.

Auch Sie fragte nicht in der Frage, aber im Titel erwähnten Sie Zukunft Veranstaltungen. Das ist ein ganz anderes Szenario, und oft erfordert Sie erfassen die lokale Zeit und IANA-Zeitzone. Siehe this answer for more details.

Sie möchten vielleicht auch Daylight saving time and time zone best practices lesen.

Verwandte Themen