2013-02-08 4 views
5

Zunächst einmal, ich bin nicht auf der Suche nach ob DST ist lokal wirksam.Javascript Date - wie zu wissen, ob DST in einer bestimmten Zeitzone ist

Ich führe einen Node-Prozess mit Daten aus, denen Zeitstempel zugeordnet sind. Ich muss diese Zeitstempel zu einem Tag/einem Monat/Jahr in einer bestimmten Zeitzone konvertieren, aber alles, was ich gebe, ist der Offset der Zeitzone und der DST-Offset.

Ich wünschte, Datum/Moment funktionierte besser mit Zeitzonen. Sie funktionieren hervorragend mit UTC oder lokalen Zeitzonen, aber es scheint, dass Sie sie hacken müssen, um etwas anderes zu bekommen.

Gibt es etwas, das mir fehlt? Angenommen, ich kann feststellen, ob DST in Kraft ist, würde diese Arbeit:

var d = new Date(ts + timezone_offset - local_offset); 
d.getMonth(); 
d.getDate(); 

wo timezone_offset wird die Zeitzone des Offset (entweder den Offset-Standard oder die dst ein)?

Wie kann ich feststellen, ob DST in Kraft ist?

+0

ist dies eine doppelte: http://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time- in-javascript? rq = 1 – kmote

+0

das ist eigentlich ziemlich einfach, Sie müssen nur ein paar Datum Vergleiche, finden Sie hier mein Repo für ein erweitertes Beispiel: https://github.com/jthoburn/Date.toString.js – runspired

+0

speziell, schauen Sie sich den Code für ' Ich 'und ändern Sie es, um diese Methode zu verwenden: http://stackoverflow.com/a/14636431/1883464 – runspired

Antwort

0

Gibt es etwas, das mir fehlt? Angenommen, ich kann feststellen, ob DST in Kraft ist, würde das funktionieren, wo timezone_offset der Offset der angeforderten Zeitzone ist?

Versuchen Sie immer die UTC-Methoden zu verwenden, um Attribute von Daten zu erhalten. Auf diese Weise Ihre (Servers) lokale Zeitzone keine Berechnungen beeinflussen:

var d = new Date(ts + timezone_offset); 
d.getUTCMonth(); 
d.getUTCDate(); 

Wie kann ich feststellen, ob DST in Kraft ist?

Das ist kompliziert. Es gibt/gab viele verschiedene Algorithmen, um den Beginn und das Ende der Sommerzeit zu bestimmen, abhängig von der Region - siehe zum Beispiel http://en.wikipedia.org/wiki/Daylight_saving_time_by_country.

Ich weiß nicht, ob es Bibliotheken gibt, die diese bereits codiert haben, oder vielleicht sogar die timezone database für korrekte Informationen kontaktieren. Der letzte Ausweg wäre, den Benutzer selbst nach Einzelheiten der Zeitzone zu fragen.

0

moment.js (http://momentjs.com/) hat eine isDST-Funktion. Sie könnten Moment verwenden (viel einfacher) oder überprüfen, wie es implementiert ist.

moment(your_date).isDST(); 
+2

Das funktioniert nur, wenn Sie überprüfen, ob das Datum in der * lokalen * Zeitzone in DST ist. Nicht in irgendeiner anderen willkürlichen Zone. –

2

Erstens erkennen, dass, wenn alles, was Sie sind, haben die Offsets, können Sie dieses Problem nicht lösen. Sie müssen über eine Zeitzonenkennung verfügen, z. B. "America/New_York". Da Sie in den Fragekommentaren gesagt haben, dass Sie das tatsächlich haben, können Sie one of these libraries verwenden, um den Job zu erledigen.

Ich hatte zuvor eine andere Antwort auf diese Frage gepostet, Empfehlung TimeZoneJS, aber ich werde das jetzt zurückziehen - da diese Frage speziell über DST ist, und TimeZoneJS hat Fehler, die Werte in der Nähe von DST-Übergängen falsch melden.

Stattdessen empfehle ich jetzt die Verwendung von moment.js mit dem moment-timezone Add-on.Sobald die Installation beiden Bibliotheken (wobei Sie aktuelle Zeitzone-Daten zu laden, pro der Dokumentation), der Code ist ganz einfach:

moment(timestamp).tz(timezone).isDST() 

Zum Beispiel:

moment(1451624400000).tz('America/New_York').isDST(); // false 
moment(1467345600000).tz('America/New_York').isDST(); // true 

Oder, wenn Ihre Zeitstempel bereits Strings in Bezug auf die lokale Zeit, dann diese Syntax statt:

moment.tz('2016-01-01T00:00:00','America/New_York').isDST(); // false 
moment.tz('2016-07-01T00:00:00','America/New_York').isDST(); // true 
+0

Verwendet diese Bibliothek Date-Objekt als Proxy unter der Haube wie timezoneJS? Oder haben sie alles von Grund auf umgesetzt? – matf

+0

Moment selbst verwendet derzeit das 'Date'-Objekt für einige Dinge, berücksichtigt jedoch alle verschiedenen Macken. Dennoch haben wir [ein offenes Element] (https://github.com/moment/moment/issues/2617), um es zu entfernen. Moment-timezone implementiert alles von Grund auf in Bezug auf Zeitzonen. Es ist nicht auf das Date-Objekt angewiesen, um Zeitzonenkonvertierungen durchzuführen. –

+0

Ich habe Fälle getestet, in denen timezoneJS fehlschlagen würde und sie funktionieren korrekt mit Moment-Zeitzone. – matf

Verwandte Themen