El getTimezoneOffset()
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 en heure d'été (DST) renvoie le nombre 300. 300 minutes représentent un décalage de 5 heures par rapport à zéro. 300 minutes divisées par 60 minutes correspondent à 5 heures. Chaque fuseau horaire est comparé au fuseau horaire zéro, +00:00 / Etc/GMT / Greenwich time.
Docs Web du 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 gérées par l'Internet Assigned Numbers Authority (iana).
fuseaux horaires de l'iana
Un tableau joliment formaté des fuseaux horaires est fourni par joda.org.
joda-time Fuseaux horaires
+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
En été, l'heure d'été est toujours avancée par rapport à l'heure "normale". Vous réglez vos horloges en arrière à la saison d'automne. (slogan "Fall Back" pour se rappeler ce qu'il faut faire)
Ainsi, l'heure d'Amérique/New_York en heure d'été (hiver) est une heure avant l'heure normale. Ainsi, par exemple, ce qui était normalement 5 heures de l'après-midi dans la ville de New York en été, est maintenant 4 heures de l'heure d'Amérique/New_York en heure d'été. Le nom de l'heure "America/New_York" est un nom de fuseau horaire "Long Format". La côte est des États-Unis appelle généralement son fuseau horaire Eastern Standard Time (EST).
Si vous voulez comparer le décalage horaire d'aujourd'hui à celui d'une autre date, vous devez savoir que le signe mathématique (+/- "positif/négatif") du décalage 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 sur son axe dans le sens inverse des aiguilles d'une montre. Une personne qui observe le lever du soleil à Greenwich voit le lever du soleil 5 heures avant une personne à New York. Et une personne sur la côte ouest des États-Unis verra le lever du soleil après qu'une personne sur la côte est des États-Unis aura vu le lever du soleil.
Il y a une raison pour laquelle vous devez savoir tout ça. Pour que vous puissiez déterminer logiquement si un code JavaScript obtient l'état DST correctement ou non, sans avoir besoin de tester chaque fuseau horaire à différents moments de l'année.
Imaginez que nous sommes en novembre à New York, et que les horloges ont été reculées 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 et en obtenant ensuite 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
Ainsi, vous pouvez maintenant créer une date en janvier et voir ce que votre navigateur retourne 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
Il est évident que 300 est plus grand que 240. Alors, qu'est-ce que cela signifie ? Devriez-vous écrire un code qui teste que le décalage hivernal est plus grand que le décalage estival ? Ou que le décalage d'été est inférieur à celui d'hiver ? S'il y a une différence entre les décalages des fuseaux horaires d'été et d'hiver, alors 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 des navigateurs. 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 : ? - Cela dépend de la période de l'année.
Si le décalage du fuseau horaire d'aujourd'hui et le décalage du fuseau horaire d'été sont les mêmes, ET les décalages des fuseaux horaires d'été et d'hiver sont différents, alors par déduction logique, aujourd'hui ne doit PAS être en DST.
Peut-on omettre de comparer les décalages des fuseaux horaires d'été et d'hiver (pour savoir si l'heure d'été est utilisée pour ce fuseau horaire) et se contenter de comparer le décalage du fuseau horaire d'aujourd'hui au décalage du fuseau horaire d'été, et obtenir toujours la bonne réponse ?
today's TZ Offset !== Summer TZ Offset
Aujourd'hui, c'est l'hiver ou l'été ? Si vous le saviez, vous pourriez 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 du jour est en hiver ou en été. Chaque fuseau horaire peut avoir ses propres règles pour le début et la fin de l'heure d'été. Il faudrait suivre les règles de chaque fuseau horaire pour chaque fuseau horaire dans le monde. S'il existe un moyen plus simple et plus efficace, autant le faire de la manière la plus simple et la plus efficace.
Il vous faut donc savoir si ce fuseau horaire utilise l'heure d'été, puis comparer le décalage horaire d'aujourd'hui avec celui 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 du 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
}