La getTimezoneOffset()
méthode en JavaScript, dans un navigateur, renvoie le nombre de minutes de décalage par rapport au fuseau horaire 00:00. Par exemple, le fuseau horaire Amérique / New_York dans Daylight Savings (DST) renvoie le nombre 300. 300 minutes correspondent à 5 heures de différence par rapport à zéro. 300 minutes divisées par 60 minutes font 5 heures. Chaque fuseau horaire est comparé au fuseau horaire zéro, +00: 00 / Etc / GMT / heure de Greenwich.
Documents Web MDN
La prochaine chose que vous devez savoir, c'est que le décalage a le signe opposé du fuseau horaire réel.
Les informations sur les fuseaux horaires sont conservées par Internet Assigned Numbers Authority (iana)
fuseaux horaires iana
Un tableau des fuseaux horaires bien formaté est fourni par joda.org
Fuseaux horaires joda-time
+00: 00 ou Etc / GMT est l'heure de Greenwich
Tous les fuseaux horaires sont décalés de +00: 00 / "Etc / GMT" / heure de Greenwich
L'heure d'été est toujours antérieure à l'heure "normale" de l'été. Vous réglez vos horloges à l'automne. (Slogan "Fall Back" pour se souvenir de ce qu'il faut faire)
Ainsi, l'heure Amérique / New_York en heure d'été (hiver) est une heure avant l'heure normale. Ainsi, par exemple, ce qui était normalement 17 heures l'après-midi à New York en été, est maintenant 16 heures heure Amérique / New_York en heure d'été. Le nom heure "Amérique / New_York" est un nom de fuseau horaire "Long Format". La côte est des États-Unis appelle généralement leur fuseau horaire heure normale de l'Est (EST)
Si vous souhaitez comparer le décalage de fuseau horaire d'aujourd'hui au décalage de fuseau horaire d'une autre date, vous devez savoir que le signe mathématique (+/- «Positif / Négatif») du décalage de fuseau horaire est l'opposé du fuseau horaire.
Regardez le tableau des fuseaux horaires sur joda.org et trouvez le fuseau horaire pour "America / New_York". Il aura un signe négatif devant le décalage standard.
La terre tourne dans le sens antihoraire sur son axe. Une personne regarde le lever du soleil à Greenwich voit le lever du soleil 5 heures avant que quelqu'un à New York ne voie le lever du soleil. Et quelqu'un sur la côte ouest des États-Unis verra le lever du soleil après que quelqu'un sur la côte est des États-Unis voit le lever du soleil.
Il y a une raison pour laquelle vous devez savoir tout cela. Ainsi, vous serez en mesure de déterminer logiquement si un code JavaScript obtient le statut DST correctement ou non, sans avoir à tester chaque fuseau horaire à différents moments de l'année.
Imaginez que nous sommes en novembre à New York et que les horloges ont reculé d'une heure. En été à New York, le décalage est de 240 minutes ou 4 heures.
Vous pouvez tester cela en créant une date qui est en juillet, puis en obtenant le décalage.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
Qu'est-ce qui sera imprimé dans le journal de la console des outils de développement du navigateur?
La réponse est: 240
Vous pouvez désormais créer une date en janvier et voir ce que votre navigateur renvoie pour un décalage de fuseau horaire pour la saison d'hiver.
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 réponse est: 300
De toute évidence, 300 est plus grand que 240. Alors, qu'est-ce que cela signifie? Devriez-vous écrire du code qui teste que le décalage d'hiver est plus grand que le décalage d'été? Ou le décalage d'été moins que le décalage d'hiver? S'il existe une différence entre les décalages de fuseau horaire d'été et d'hiver, vous pouvez supposer que l'heure d'été est utilisée pour ce fuseau horaire. Mais cela ne vous dit pas si aujourd'hui utilise l'heure d'été pour le fuseau horaire du navigateur. Vous devrez donc obtenir le décalage du fuseau horaire pour aujourd'hui.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
La réponse est:? - Dépend de la période de l'année
Si le décalage du fuseau horaire du jour et le décalage du fuseau horaire d'été sont identiques, ET que les décalages de fuseau horaire d'été et d'hiver sont différents, alors par déduction logique, aujourd'hui ne doit PAS être en heure d'été.
Pouvez-vous omettre de comparer les décalages de fuseau horaire d'été et d'hiver, (Pour savoir si l'heure d'été est utilisée pour ce fuseau horaire) et simplement comparer le décalage de fuseau horaire d'aujourd'hui au décalage TZ d'été, et toujours obtenir la bonne réponse?
today's TZ Offset !== Summer TZ Offset
Eh bien, est-ce aujourd'hui en hiver ou en été? Si vous le saviez, vous pouvez appliquer la logique suivante:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Mais le problème est que vous ne savez pas si la date d'aujourd'hui est en hiver ou en été. Chaque fuseau horaire peut avoir ses propres règles pour le démarrage et l'arrêt de l'heure d'été. Vous auriez besoin de garder une trace des règles de chaque fuseau horaire pour chaque fuseau horaire dans le monde. Donc, s'il existe un moyen meilleur et plus simple, vous pouvez aussi bien le faire de la manière la plus simple et la meilleure.
Ce qu'il nous reste, c'est que vous devez savoir si ce fuseau horaire utilise l'heure d'été, puis comparer le décalage du fuseau horaire d'aujourd'hui avec le décalage du fuseau horaire d'été. Cela vous donnera toujours une réponse fiable.
La logique finale est:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Fonction permettant de déterminer si le fuseau horaire dans le navigateur utilise l'heure d'été:
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
renvoie la valeur inverse, alorsMath.max
renvoie effectivement le décalage standard . Le code est correct.