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.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
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.
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
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.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
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?
today's TZ Offset !== Summer TZ Offset
Nun, ist heute im Winter oder Sommer? Wenn Sie das wüssten, könnten Sie die folgende Logik anwenden:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
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:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Funktion zum Bestimmen, ob die Zeitzone im Browser die Sommerzeit verwendet:
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
getTimezoneOffset
den inversen Wert zurückgibt,Math.max
wird tatsächlich der Standardoffset zurückgegeben . Der Code ist korrekt.