In einer JS-App erhalte ich einen Zeitstempel (Gl. 1270544790922
) Vom Server (Ajax).
Basierend auf diesem Zeitstempel erstelle ich ein Date
Objekt mit:
var _date = new Date();
_date.setTime(1270544790922);
Jetzt _date
dekodierter Zeitstempel in der aktuellen Zeitzone des Benutzergebietsschemas. Das will ich nicht
Ich möchte _ date
diesen Zeitstempel in die aktuelle Zeit in der Stadt Helsinki in Europa konvertieren (ohne Berücksichtigung der aktuellen Zeitzone des Benutzers).
Wie kann ich das machen?
javascript
date
timezone
Warpech
quelle
quelle
Antworten:
Der zugrunde liegende Wert eines Datumsobjekts ist tatsächlich in UTC. Um dies zu beweisen, beachten Sie, dass beim
new Date(0)
Tippen Folgendes angezeigt wird :Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 wird in GMT als 0 behandelt, aber die.toString()
Methode zeigt die Ortszeit an.UTC steht für Universal Time Code. Die aktuelle Zeit an 2 verschiedenen Orten ist dieselbe UTC, aber die Ausgabe kann unterschiedlich formatiert werden.
Was wir hier brauchen, ist eine Formatierung
Dies funktioniert, aber ... Sie können keine der anderen Datumsmethoden für Ihre Zwecke verwenden, da sie die Zeitzone des Benutzers beschreiben. Was Sie wollen, ist ein Datumsobjekt, das mit der Zeitzone von Helsinki zusammenhängt. Zu diesem Zeitpunkt können Sie eine Bibliothek eines Drittanbieters verwenden (ich empfehle dies) oder das Datumsobjekt hacken, damit Sie die meisten seiner Methoden verwenden können.
Option 1 - eine Drittanbieter-ähnliche Moment-Zeitzone
Das sieht viel eleganter aus als das, was wir als nächstes tun werden.
Option 2 - Hacken Sie das Datumsobjekt
Es glaubt immer noch, es sei GMT-0700 (PDT), aber wenn Sie nicht zu stark starren, können Sie dies möglicherweise mit einem Datumsobjekt verwechseln, das für Ihre Zwecke nützlich ist.
Ich habe bequemerweise einen Teil übersprungen. Sie müssen definieren können
currentHelsinkiOffset
. Wenn Siedate.getTimezoneOffset()
auf der Serverseite oder nur einige if-Anweisungen verwenden können, um zu beschreiben, wann die Zeitzonenänderungen auftreten, sollte dies Ihr Problem lösen.Fazit - Ich denke, speziell für diesen Zweck sollten Sie eine Datumsbibliothek wie Moment-Zeitzone verwenden .
quelle
*60*60
sollte stattdessen sein*60000
, da getTime in Millisekunden und getTimezoneOffset in Minuten ist, von denen 60000 Millisekunden in einer Minute sind, nicht 60 * 60 == 3600Verwenden Sie Folgendes, um Millisekunden und die Zeitzone des Benutzers zu berücksichtigen:
quelle
Nur ein anderer Ansatz
Prost!
quelle
new Date().getTimezoneOffset()
sollte innew Date(timestampStr).getTimezoneOffset()
Ich habe den Verdacht, dass die Antwort nicht das richtige Ergebnis liefert. In der Frage möchte der Fragesteller den Zeitstempel vom Server in die aktuelle Zeit in Hellsinki konvertieren, ohne die aktuelle Zeitzone des Benutzers zu berücksichtigen.
Es ist die Tatsache, dass die Zeitzone des Benutzers diejenige sein kann, auf die wir nicht vertrauen können.
Wenn z. Zeitstempel ist 1270544790922 und wir haben eine Funktion:
Wenn ein New Yorker die Seite besucht, wird die Warnung (_helsenkiTime) gedruckt:
Und wenn ein Finlander die Seite besucht, wird die Warnung (_helsenkiTime) gedruckt:
Die Funktion ist also nur dann korrekt, wenn der Seitenbesucher die Zielzeitzone (Europa / Helsinki) in seinem Computer hat, aber in fast allen anderen Teilen der Welt ausfällt. Und da der Server-Zeitstempel normalerweise ein UNIX-Zeitstempel ist, der per Definition in UTC die Anzahl der Sekunden seit der Unix-Epoche (1. Januar 1970, 00:00:00 GMT) ist, können wir die Sommerzeit oder Nicht-Sommerzeit nicht anhand des Zeitstempels ermitteln.
Die Lösung besteht also darin, die aktuelle Zeitzone des Benutzers zu ignorieren und eine Methode zur Berechnung des UTC-Versatzes zu implementieren, unabhängig davon, ob das Datum in der Sommerzeit liegt oder nicht. Javascript verfügt nicht über eine native Methode zum Bestimmen des DST-Übergangsverlaufs einer anderen Zeitzone als der aktuellen Zeitzone des Benutzers. Dies können wir am einfachsten mithilfe eines serverseitigen Skripts erreichen, da wir einfachen Zugriff auf die Zeitzonendatenbank des Servers mit dem gesamten Übergangsverlauf aller Zeitzonen haben.
Wenn Sie jedoch keinen Zugriff auf die Zeitzonendatenbank des Servers (oder eines anderen Servers) haben UND der Zeitstempel in UTC ist, können Sie die ähnliche Funktionalität erhalten, indem Sie die DST-Regeln in Javascript fest codieren.
Um Daten in den Jahren 1998 - 2099 in Europa / Helsinki abzudecken, können Sie die folgende Funktion verwenden ( jsfiddled ):
Anwendungsbeispiele:
Und dies druckt Folgendes unabhängig von der Zeitzone des Benutzers:
Wenn Sie den Zeitstempel in einer Form zurückgeben können, in der der Versatz (Sommerzeit oder Nicht-Sommerzeit) bereits zum Zeitstempel auf dem Server hinzugefügt wurde, müssen Sie ihn natürlich nicht clientseitig berechnen und können die Funktion erheblich vereinfachen. ABER denken Sie daran, timezoneOffset () NICHT zu verwenden, da Sie sich dann mit der Zeitzone des Benutzers befassen müssen und dies nicht das gewünschte Verhalten ist.
quelle
Vorausgesetzt, Sie erhalten den Zeitstempel in Helsinki-Zeit, würde ich ein Datumsobjekt erstellen, das auf Mitternacht am 1. Januar 1970 UTC festgelegt ist (um die lokalen Zeitzoneneinstellungen des Browsers nicht zu berücksichtigen). Fügen Sie dann einfach die erforderliche Anzahl von Millisekunden hinzu.
Achten Sie später darauf, immer UTC-Werte vom Datumsobjekt abzufragen. Auf diese Weise sehen Benutzer unabhängig von den lokalen Einstellungen dieselben Datumswerte. Andernfalls werden Datumswerte entsprechend den lokalen Zeiteinstellungen verschoben.
quelle
Du könntest benutzen
setUTCMilliseconds()
quelle
setUTCMilliseconds()
Methode legt die Millisekunden für ein bestimmtes Datum entsprechend der Weltzeit fest. [...] Wenn ein von Ihnen angegebener Parameter außerhalb des erwarteten Bereichs liegt, wirdsetUTCMilliseconds()
versucht, die Datumsinformationen im Date-Objekt entsprechend zu aktualisieren. Mit anderen Worten, Sie erstellenDate
um UTC ein Objekt mit dem angegebenen Unix-Zeitstempel.