getTimezoneOffset()
Metoda w JavaScript w przeglądarce, zwraca liczbę minut offsetowych ze strefy 00:00 czasu. Na przykład strefa czasowa America / New_York w czasie letnim (DST) zwraca liczbę 300. 300 minut to 5 godzin różnicy od zera. 300 minut podzielone przez 60 minut to 5 godzin. Każda strefa czasowa jest porównywana z zerową strefą czasową, +00: 00 / Etc / GMT / Greenwich.
MDN Web Docs
Następną rzeczą, którą musisz wiedzieć, jest to, że przesunięcie ma znak przeciwny do rzeczywistej strefy czasowej.
Informacje o strefach czasowych są utrzymywane przez Internet Assigned Numbers Authority (IANA)
Iana strefy czasowe
Ładnie sformatowaną tabelę stref czasowych dostarcza joda.org
Strefy czasowe czasu joda
+00: 00 lub Etc / GMT to czas Greenwich
Wszystkie strefy czasowe są przesunięte od +00: 00 / „Etc / GMT” / czasu Greenwich
Czas letni jest zawsze wcześniejszy niż „zwykły” czas letni. Zegary przestawiacie na jesień. (Slogan „Fall Back”, aby pamiętać, co robić)
Tak więc czas America / New_York w czasie letnim (zima) jest jedną godzinę przed regularnym czasem. Na przykład to, co zwykle latem było o 17:00 w Nowym Jorku, to teraz godzina 16:00 czasu Ameryki / Nowego Jorku w czasie letnim. Czas „America / New_York” to nazwa strefy czasowej „Long Format”. Wschodnie wybrzeże Stanów Zjednoczonych zazwyczaj nazywa swoją strefę czasową Wschodnim Czasem Standardowym (EST)
Jeśli chcesz porównać dzisiejsze przesunięcie strefy czasowej z przesunięciem strefy czasowej innej daty, musisz wiedzieć, że znak matematyczny (+/- „dodatnia / ujemna”) przesunięcia strefy czasowej jest przeciwieństwem strefy czasowej.
Spójrz na tabelę stref czasowych na joda.org i znajdź strefę czasową dla „America / New_York”. Przed standardowym przesunięciem będzie oznaczony minus.
Ziemia obraca się przeciwnie do ruchu wskazówek zegara wokół swojej osi. Osoba oglądająca wschód słońca w Greenwich widzi wschód słońca na 5 godzin przed tym, jak ktoś w Nowym Jorku zobaczy wschód słońca. A ktoś na zachodnim wybrzeżu USA zobaczy wschód słońca po tym, jak ktoś na wschodnim wybrzeżu Stanów Zjednoczonych zobaczy wschód słońca.
Jest powód, dla którego musisz to wszystko wiedzieć. Dzięki temu będziesz w stanie logicznie określić, czy jakiś kod JavaScript otrzymuje poprawny stan czasu letniego, czy nie, bez konieczności testowania każdej strefy czasowej o różnych porach roku.
Wyobraź sobie, że w Nowym Jorku jest listopad, a zegary cofnięto o godzinę. Latem w Nowym Jorku przesunięcie to 240 minut lub 4 godziny.
Możesz to sprawdzić, tworząc datę przypadającą na lipiec, a następnie uzyskując przesunięcie.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
Co zostanie wydrukowane w dzienniku konsoli narzędzi programistycznych przeglądarki?
Odpowiedź brzmi: 240
Więc teraz możesz utworzyć datę w styczniu i zobaczyć, co zwraca Twoja przeglądarka dla przesunięcia strefy czasowej na sezon zimowy.
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)
Odpowiedź brzmi: 300
Oczywiście 300 to więcej niż 240. Więc co to oznacza? Czy powinieneś napisać kod sprawdzający, czy przesunięcie zimowe jest większe niż przesunięcie letnie? A może lato mniej niż zimowe? Jeśli istnieje różnica między przesunięciem letniej i zimowej strefy czasowej, można założyć, że w tej strefie czasowej używany jest czas letni. Ale to nie mówi ci, czy dzisiaj używa się czasu letniego dla strefy czasowej przeglądarek. Musisz więc pobrać dzisiejsze przesunięcie strefy czasowej.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
Odpowiedź to: ? - Zależy od pory roku
Jeśli przesunięcie dzisiejszej strefy czasowej i przesunięcie strefy czasowej letniej jest takie samo, ORAZ przesunięcie strefy czasowej letniej i zimowej jest różne, to zgodnie z logiczną dedukcją dzisiejszy dzień NIE może być czasem letnim.
Czy możesz pominąć porównanie przesunięć strefy czasowej letniej i zimowej (aby wiedzieć, czy czas letni jest używany w tej strefie czasowej) i po prostu porównać przesunięcie dzisiejszej strefy czasowej z przesunięciem letniego czasu TZ i zawsze uzyskać poprawną odpowiedź?
today's TZ Offset !== Summer TZ Offset
Cóż, dziś zimą czy latem? Gdybyś to wiedział, mógłbyś zastosować następującą logikę:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Problem w tym, że nie wiadomo, czy dzisiejsza data jest zimą czy latem. Każda strefa czasowa może mieć własne zasady dotyczące rozpoczęcia i zakończenia czasu letniego. Musisz śledzić zasady każdej strefy czasowej dla każdej strefy czasowej na świecie. Tak więc, jeśli istnieje lepszy i łatwiejszy sposób, równie dobrze możesz to zrobić w lepszy i łatwiejszy sposób.
Pozostaje nam tylko to, że musisz wiedzieć, czy ta strefa czasowa używa czasu letniego, a następnie porównać dzisiejsze przesunięcie strefy czasowej z przesunięciem strefy czasowej letniej. To zawsze da ci wiarygodną odpowiedź.
Ostateczna logika to:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Funkcja określająca, czy strefa czasowa w przeglądarce używa czasu letniego:
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
zwraca wartość odwrotną,Math.max
to rzeczywiście zwraca standardowe przesunięcie. Kod jest poprawny.