Il getTimezoneOffset()
metodo in JavaScript, in un browser, restituisce il numero di offset dei minuti dal fuso orario 00:00. Ad esempio, il fuso orario America / New_York in Ora legale (DST) restituisce il numero 300. 300 minuti sono 5 ore di differenza da zero. 300 minuti divisi per 60 minuti sono 5 ore. Ogni fuso orario viene confrontato con il fuso orario zero, +00: 00 / Etc / GMT / ora di Greenwich.
Documenti Web MDN
La prossima cosa che devi sapere è che l'offset ha il segno opposto del fuso orario effettivo.
Le informazioni sui fusi orari sono gestite dall'Internet Assigned Numbers Authority (iana)
fusi orari iana
Una tabella di fusi orari ben formattata è fornita da joda.org
fusi orari joda-time
+00: 00 o Etc / GMT è l'ora di Greenwich
Tutti i fusi orari sono sfalsati da +00: 00 / "Etc / GMT" / ora di Greenwich
L'ora legale è sempre precedente all'ora "normale" in estate. Riporti gli orologi nella stagione autunnale. (Slogan "Fall Back" per ricordare cosa fare)
Pertanto, l'ora di America / New_York nell'ora legale (inverno) è un'ora prima dell'orario normale. Quindi, ad esempio, quello che era normalmente alle 17:00 nel pomeriggio a New York City in estate, ora è alle 16:00 America / New_York l'ora legale. Il nome "America / New_York" ora è un nome di fuso orario "Long Format". La costa orientale degli Stati Uniti in genere chiama il loro fuso orario Eastern Standard Time (EST)
Se si desidera confrontare l'offset del fuso orario di oggi con l'offset del fuso orario di un'altra data, è necessario sapere che il segno matematico (+/- "Positivo / Negativo") dell'offset del fuso orario è l'opposto del fuso orario.
Guarda la tabella dei fusi orari su joda.org e trova il fuso orario per "America / New_York" Avrà un segno negativo davanti all'offset standard.
La terra ruota in senso antiorario sul suo asse. Una persona che guarda l'alba a Greenwich vede l'alba 5 ore prima che qualcuno a New York City vedrà l'alba. E qualcuno sulla costa occidentale degli Stati Uniti vedrà l'alba dopo che qualcuno sulla costa orientale degli Stati Uniti vede l'alba.
C'è un motivo per cui devi sapere tutto questo. In questo modo sarai in grado di determinare logicamente se un codice JavaScript sta ottenendo correttamente o meno lo stato dell'ora legale, senza bisogno di testare ogni fuso orario in diversi periodi dell'anno.
Immagina che sia novembre a New York City e che gli orologi siano arretrati di un'ora. In estate a New York City, l'offset è di 240 minuti o 4 ore.
È possibile verificare ciò creando una data che è in luglio e quindi ottenere l'offset.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
Cosa verrà stampato nel registro della console degli strumenti di sviluppo del browser?
La risposta è: 240
Quindi, ora puoi creare una data a gennaio e vedere cosa restituisce il tuo browser per un offset di fuso orario per la stagione invernale.
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)
La risposta è: 300
Ovviamente 300 è più grande di 240. Quindi, cosa significa? Dovresti scrivere un codice che verifichi che l'offset invernale è maggiore dell'offset estivo? O la compensazione estiva è inferiore alla compensazione invernale? Se esiste una differenza tra gli offset del fuso orario estivo e invernale, è possibile supporre che l'ora legale venga utilizzata per questo fuso orario. Ma ciò non ti dice se oggi si sta utilizzando l'ora legale per il fuso orario del browser. Quindi, dovrai ottenere l'offset del fuso orario per oggi.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
La risposta è:? - Dipende dal periodo dell'anno
Se l'offset del fuso orario di oggi e l'offset del fuso orario estivo sono uguali, E gli offset del fuso orario estivo e invernale sono diversi, quindi per deduzione logica, oggi NON deve essere in ora legale.
Puoi omettere di confrontare gli offset del fuso orario estivo e invernale (per sapere se l'ora legale è usata per questo fuso orario) e confrontare semplicemente l'offset del fuso orario di oggi con l'offset TZ estivo e ottenere sempre la risposta corretta?
today's TZ Offset !== Summer TZ Offset
Bene, è oggi in inverno o in estate? Se lo sapessi, potresti applicare la seguente logica:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Ma il problema è che non sai se la data di oggi è in inverno o in estate. Ogni fuso orario può avere le proprie regole per l'avvio e l'arresto dell'ora legale. Dovresti tenere traccia delle regole di ogni fuso orario per ogni fuso orario nel mondo. Quindi, se c'è un modo migliore e più semplice, allora potresti farlo nel modo migliore e più semplice.
Ciò che ci rimane è che devi sapere se questo fuso orario utilizza l'ora legale e quindi confrontare l'offset del fuso orario di oggi con l'offset del fuso orario estivo. Questo ti darà sempre una risposta affidabile.
La logica finale è:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Funzione per determinare se il fuso orario nel browser utilizza l'ora legale:
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
restituisce il valore inverso,Math.max
restituisce effettivamente l' offset standard . Il codice è corretto