Dies ist ein Teil meines JS-Codes, für den dies benötigt wird:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Ich möchte die Datums- und Uhrzeitangabe in "vor" erhalten, aber wenn die Sommerzeit verwendet wird, sind die Datumsangaben um 1 Stunde verschoben. Ich weiß nicht, wie ich überprüfen soll, ob die Sommerzeit wirksam ist oder nicht.
Wie kann ich wissen, wann die Sommerzeit beginnt und endet?
quelle
getTimezoneOffset
den inversen Wert zurückgibt,Math.max
wird tatsächlich der Standardoffset zurückgegeben . Der Code ist korrekt.Erstellen Sie zwei Daten: eine im Juni und eine im Januar. Vergleichen Sie ihre getTimezoneOffset () -Werte.
Überprüfen Sie nun getTimezoneOffset () des aktuellen Datums.
quelle
Diese Antwort ist der akzeptierten Antwort ziemlich ähnlich, überschreibt jedoch nicht den
Date
Prototyp und verwendet nur einen Funktionsaufruf, um zu überprüfen, ob die Sommerzeit wirksam ist, anstatt zwei.Die Idee ist, dass, da kein Land die Sommerzeit einhält, die 7 Monate dauert [1] , in einem Gebiet, in dem die Sommerzeit eingehalten wird, der Versatz von der UTC-Zeit im Januar anders sein wird als im Juli.
Während die Sommerzeit die Uhren vorwärts bewegt , gibt JavaScript während der Standardzeit immer einen größeren Wert zurück. Wenn Sie also den Mindestversatz zwischen Januar und Juli erhalten, erhalten Sie den Zeitzonenversatz während der Sommerzeit.
Wir prüfen dann, ob die Zeitzone des Datums diesem Mindestwert entspricht. Wenn ja, dann sind wir in der Sommerzeit; sonst sind wir nicht.
Die folgende Funktion verwendet diesen Algorithmus. Es nimmt ein Datumsobjekt
d
und wird zurückgegeben,true
wenn für dieses Datum Sommerzeit gilt undfalse
wenn dies nicht der Fall ist:quelle
Math.max(...) != d.get...()
, wird true zurückgegeben, wenn die Sommerzeit in der angegebenen Zeitzone eingehalten wird UND das Datum derzeit in der Sommerzeit liegt. Wenn die Sommerzeit nicht eingehalten wird oder das Datum mit dem Standardversatz übereinstimmt, wird false zurückgegeben.Ich war heute mit dem gleichen Problem konfrontiert, aber da unsere Sommerzeit zu unterschiedlichen Zeiten in den USA beginnt und endet (zumindest nach meinem Verständnis), habe ich eine etwas andere Route verwendet.
Dann vergleichen Sie einfach den aktuellen Zeitzonenversatz mit DST und nonDST, um festzustellen, welcher übereinstimmt.
quelle
Basierend auf Matt Johansons Kommentar zu der von Sheldon Griffin bereitgestellten Lösung habe ich den folgenden Code erstellt:
Es versucht, das Beste aus allen Welten zu bekommen, wobei alle Kommentare und zuvor vorgeschlagenen Antworten berücksichtigt werden und insbesondere Folgendes:
1) Zwischenspeichert das Ergebnis für stdTimezoneOffset pro Jahr, sodass Sie es nicht neu berechnen müssen, wenn Sie mehrere Daten im selben Jahr testen.
2) Es wird nicht davon ausgegangen, dass die Sommerzeit (falls überhaupt vorhanden) notwendigerweise im Juli liegt und auch dann funktioniert, wenn sie irgendwann und irgendwann in einem Monat sein wird. In Bezug auf die Leistung wird es jedoch schneller funktionieren, wenn im Juli (oder in der Nähe von Monaten) tatsächlich Sommerzeit ist.
3) Im schlimmsten Fall wird das getTimezoneOffset des ersten eines jeden Monats verglichen. [und mach das einmal pro getestetem Jahr].
Es wird immer noch davon ausgegangen, dass die Sommerzeit größer als ein einzelner Monat ist.
Wenn jemand diese Annahme aufheben möchte, kann er die Schleife in etwas ändern, das eher der Lösung von Aaron Cole entspricht - aber ich würde trotzdem ein halbes Jahr voraus springen und aus der Schleife ausbrechen, wenn zwei verschiedene Offsets gefunden werden.]
quelle
Die Bibliothek moment.js bietet eine
.isDst()
Methode für ihre Zeitobjekte .quelle
Die
getTimezoneOffset()
Methode in JavaScript in einem Browser gibt die Anzahl der Minuten zurück, die von der Zeitzone 00:00 versetzt sind. Beispielsweise gibt die Zeitzone America / New_York in der Sommerzeit (DST) die Zahl 300 zurück. 300 Minuten sind 5 Stunden Unterschied von Null. 300 Minuten geteilt durch 60 Minuten sind 5 Stunden. Jede Zeitzone wird mit der Zeitzone Null verglichen, +00: 00 / Etc / GMT / Greenwich-Zeit.MDN-Webdokumente
Das nächste, was Sie wissen müssen, ist, dass der Versatz das entgegengesetzte Vorzeichen der tatsächlichen Zeitzone hat.
Informationen zu Zeitzonen werden von der Internet Assigned Numbers Authority (iana) verwaltet.
iana Zeitzonen
Eine schön formatierte Tabelle mit Zeitzonen wird von joda.org bereitgestellt
joda-time Zeitzonen
+00: 00 oder Etc / GMT ist Greenwich-Zeit
Alle Zeitzonen sind von +00: 00 / "Etc / GMT" / Greenwich-Zeit versetzt
Die Sommerzeit ist immer eine frühere Zeit als die "normale" Zeit im Sommer. Sie stellen Ihre Uhren in der Herbstsaison zurück. (Slogan "Fall Back", um sich daran zu erinnern, was zu tun ist)
Die America / New_York-Zeit in der Sommerzeit (Winter) liegt also eine Stunde vor der regulären Zeit. So war beispielsweise im Sommer in New York City normalerweise um 17 Uhr nachmittags die Sommerzeit um 16 Uhr in Amerika / New York. Der Name "America / New_York" ist ein Zeitzonenname im "Langformat". Die Ostküste der USA nennt ihre Zeitzone normalerweise Eastern Standard Time (EST).
Wenn Sie den heutigen Zeitzonenversatz mit dem Zeitzonenversatz eines anderen Datums vergleichen möchten, müssen Sie wissen, dass das mathematische Vorzeichen (+/- "Positiv / Negativ") des Zeitzonenversatzes das Gegenteil der Zeitzone ist.
Schauen Sie sich die Zeitzonentabelle auf joda.org an und finden Sie die Zeitzone für "America / New_York". Vor dem Standardversatz wird ein negatives Vorzeichen angezeigt.
Die Erde dreht sich um ihre Achse gegen den Uhrzeigersinn. Eine Person, die den Sonnenaufgang in Greenwich beobachtet, sieht den Sonnenaufgang 5 Stunden bevor jemand in New York City den Sonnenaufgang sieht. Und jemand an der Westküste der USA wird den Sonnenaufgang sehen, nachdem jemand an der Ostküste der USA den Sonnenaufgang gesehen hat.
Es gibt einen Grund, warum Sie das alles wissen müssen. Damit Sie logisch feststellen können, ob ein JavaScript-Code den DST-Status korrekt erhält oder nicht, ohne jede Zeitzone zu unterschiedlichen Jahreszeiten testen zu müssen.
Stellen Sie sich vor, es ist November in New York City und die Uhren wurden um eine Stunde zurückgestellt. Im Sommer in New York City beträgt der Offset 240 Minuten oder 4 Stunden.
Sie können dies testen, indem Sie ein Datum im Juli erstellen und dann den Versatz abrufen.
Was wird im Konsolenprotokoll der Entwicklertools des Browsers gedruckt?
Die Antwort lautet: 240
Jetzt können Sie ein Datum im Januar erstellen und sehen, was Ihr Browser für einen Zeitzonenversatz für die Wintersaison zurückgibt.
Die Antwort lautet: 300
Offensichtlich ist 300 größer als 240. Was bedeutet das? Sollten Sie Code schreiben, der prüft, ob der Winterversatz größer als der Sommerversatz ist? Oder der Sommerversatz weniger als der Winterversatz? Wenn es einen Unterschied zwischen den Sommer- und Winterzeitzonenversätzen gibt, können Sie davon ausgehen, dass die Sommerzeit für diese Zeitzone verwendet wird. Das sagt Ihnen jedoch nicht, ob heute die Sommerzeit für die Zeitzone des Browsers verwendet wird. Sie müssen also den Zeitzonenversatz für heute erhalten.
Antwort ist: ? - Abhängig von der Jahreszeit
Wenn der heutige Zeitzonenversatz und der Sommerzeitzonenversatz gleich sind UND die Sommer- und Winterzeitzonenversätze unterschiedlich sind, darf der heutige Tag logischerweise NICHT in der Sommerzeit liegen.
Können Sie den Vergleich der Sommer- und Winterzeitzonenversätze weglassen (um zu wissen, ob die Sommerzeit für diese Zeitzone verwendet wird) und einfach den heutigen Zeitzonenversatz mit dem Sommer-TZ-Versatz vergleichen und immer die richtige Antwort erhalten?
Nun, ist heute im Winter oder Sommer? Wenn Sie das wüssten, könnten Sie die folgende Logik anwenden:
Das Problem ist jedoch, dass Sie nicht wissen, ob das heutige Datum im Winter oder Sommer liegt. Jede Zeitzone kann ihre eigenen Regeln für den Start und Stopp der Sommerzeit haben. Sie müssen die Regeln jeder Zeitzone für jede Zeitzone auf der Welt im Auge behalten. Wenn es also einen besseren und einfacheren Weg gibt, können Sie es genauso gut besser und einfacher machen.
Was uns bleibt, ist, dass Sie wissen müssen, ob diese Zeitzone die Sommerzeit verwendet, und dann den heutigen Zeitzonenversatz mit dem Sommerzeitzonenversatz vergleichen müssen. Das gibt Ihnen immer eine verlässliche Antwort.
Die letzte Logik lautet:
Funktion zum Bestimmen, ob die Zeitzone im Browser die Sommerzeit verwendet:
quelle
Verwenden Sie Moment.js ( https://momentjs.com/ )
moment().isDST();
gibt Ihnen, wenn Sommerzeiteinsparungen beobachtet werden.Es hat auch eine Hilfsfunktion, um die relative Zeit für Sie zu berechnen. Sie müssen keine manuellen Berechnungen durchführen, z
moment("20200105", "YYYYMMDD").fromNow();
quelle
Du bist nah dran, aber ein bisschen daneben. Sie müssen niemals Ihre eigene Zeit berechnen, da dies ein Ergebnis Ihrer eigenen Uhr ist. Es kann erkennen, ob Sie an Ihrem Standort Sommerzeit verwenden, jedoch nicht für einen entfernten Standort, der durch den Versatz erzeugt wird:
Dies ist immer noch falsch und eine Stunde später, wenn sie sich in der Sommerzeit befinden. Sie benötigen ein Remote-Zeitkonto, wenn sie sich derzeit in ihrer Sommerzeit befinden oder nicht, und passen sie entsprechend an. Versuchen Sie dies zu berechnen und ändern Sie Ihre Uhr auf - sagen wir 2/1/2015 und stellen Sie die Uhr eine Stunde zurück, als ob sie außerhalb der Sommerzeit liegt. Berechnen Sie dann einen Versatz für einen Ort, der noch 2 Stunden zurückliegen sollte. Es wird eine Stunde vor dem zweistündigen Fenster angezeigt. Sie müssten immer noch die Stunde berücksichtigen und anpassen. Ich habe es für NY und Denver gemacht und bin in Denver immer falsch gelaufen (Stunde voraus).
quelle
Ich habe das mit der Moment.js gefunden Bibliothek mit einigen der hier beschriebenen Konzepte (Vergleich von Jan mit Juni) sehr gut funktioniert.
Diese einfache Funktion gibt zurück, ob die Zeitzone, in der sich der Benutzer befindet, die Sommerzeit einhält:
Eine einfache Möglichkeit, um zu überprüfen, ob dies funktioniert (unter Windows), besteht darin, Ihre Zeitzone in eine Nicht-Sommerzeitzone zu ändern. Beispielsweise gibt Arizona false zurück, während EST oder PST true zurückgeben.
quelle
Zukunftssichere Lösung, die in allen Zeitzonen funktioniert
x
die erwartete Anzahl von Millisekunden im Jahr des Interesses sein, ohne die Sommerzeit zu berücksichtigen.y
die Anzahl der Millisekunden seit der Epoche ab Jahresbeginn des Zinsdatums.z
die Anzahl der Millisekunden seit der Epoche des vollständigen Datums und der Uhrzeit des Interessest
die Subtraktion von beidenx
undy
vonz
:z - y - x
. Dies ergibt den Versatz aufgrund der Sommerzeit.t
Null ist, ist die Sommerzeit nicht wirksam. Wennt
nicht Null ist, ist die Sommerzeit wirksam.Ich glaube, dass das obige Code-Snippet aus vielen Gründen allen anderen hier veröffentlichten Antworten überlegen ist.
Wenn Sie sich jedoch nicht auf mehr als 2 Sommerzeitperioden vorbereiten, können Sie mit dem folgenden Code bestimmen, ob die Sommerzeit als Boolescher Wert wirksam ist.
quelle
Ich musste kürzlich eine Datumszeichenfolge mit UTC und DST erstellen und basierend auf Sheldons Antwort habe ich Folgendes zusammengestellt:
quelle
Gibt es ein Problem mit der
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Dies scheint mit allen Browsern kompatibel zu sein.
quelle
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
ES6 Style
quelle