C'est un peu de mon code JS pour lequel cela est nécessaire:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Je veux obtenir le datetime dans «il y a», mais si l'heure d'été est en cours d'utilisation, les dates sont décalées d'une heure. Je ne sais pas comment vérifier si l'heure d'été est en vigueur ou non.
Comment puis-je savoir quand l'heure d'été commence et se termine?
la source
getTimezoneOffset
renvoie la valeur inverse, alorsMath.max
renvoie effectivement le décalage standard . Le code est correct.Créez deux dates: une en juin, une en janvier. Comparez leurs valeurs getTimezoneOffset ().
Vérifiez maintenant getTimezoneOffset () de la date actuelle.
la source
Cette réponse est assez similaire à la réponse acceptée, mais ne remplace pas le
Date
prototype et n'utilise qu'un seul appel de fonction pour vérifier si l'heure d'été est en vigueur, plutôt que deux.L'idée est que, comme aucun pays n'observe l'heure d'été qui dure 7 mois [1] , dans une zone qui observe l'heure d'été, le décalage par rapport à l'heure UTC en janvier sera différent de celui de juillet.
Alors que l' heure d'été déplace horloges avant , JavaScript renvoie toujours une plus grande valeur au cours de l' heure normale. Par conséquent, obtenir le décalage minimum entre janvier et juillet obtiendra le décalage du fuseau horaire pendant l'heure d'été.
Nous vérifions ensuite si le fuseau horaire des dates est égal à cette valeur minimale. Si c'est le cas, alors nous sommes en DST; sinon nous ne le sommes pas.
La fonction suivante utilise cet algorithme. Il prend un objet date
d
, et renvoietrue
si l'heure d'été est en vigueur pour cette date, etfalse
si ce n'est pas le cas:la source
Math.max(...) != d.get...()
, il retournera vrai si l'heure d'été est observée dans le fuseau horaire donné ET que la date est actuellement à l'heure d'été. Si l'heure d'été n'est pas observée ou si la date correspond au décalage standard, elle renvoie false.J'ai été confronté au même problème aujourd'hui, mais comme notre heure d'été commence et s'arrête à des heures différentes des États-Unis (du moins d'après ce que je comprends), j'ai emprunté un itinéraire légèrement différent.
Ensuite, vous comparez simplement le décalage du fuseau horaire actuel avec DST et nonDST pour voir lequel correspond.
la source
Sur la base du commentaire de Matt Johanson sur la solution fournie par Sheldon Griffin, j'ai créé le code suivant:
Il essaie d'obtenir le meilleur de tous les mondes en tenant compte de tous les commentaires et réponses suggérées précédemment et plus précisément:
1) Met en cache le résultat pour une année stdTimezoneOffset afin que vous n'ayez pas besoin de le recalculer lors du test de plusieurs dates dans la même année.
2) Il ne suppose pas que l'heure d'été (si elle existe) est nécessairement en juillet, et qu'elle fonctionnera même si elle le sera à un moment et à un autre à n'importe quel mois. Cependant, en termes de performances, cela fonctionnera plus rapidement si en effet juillet (ou près de quelques mois) sont effectivement DST.
3) Dans le pire des cas, il comparera le getTimezoneOffset du premier de chaque mois. [et faites cela une fois par année testée].
L'hypothèse qu'il fait toujours est que la période s'il y a DST est plus longue qu'un seul mois.
Si quelqu'un veut supprimer cette hypothèse, il peut changer la boucle en quelque chose qui ressemble plus à la solution fournie par Aaron Cole - mais je sauterais encore six mois à l'avance et sortirais de la boucle lorsque deux décalages différents seraient trouvés]
la source
La bibliothèque moment.js fournit une
.isDst()
méthode sur ses objets temporels.la source
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.
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.
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.
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?
Eh bien, est-ce aujourd'hui en hiver ou en été? Si vous le saviez, vous pouvez appliquer la logique suivante:
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:
Fonction permettant de déterminer si le fuseau horaire dans le navigateur utilise l'heure d'été:
la source
Utilisez Moment.js ( https://momentjs.com/ )
moment().isDST();
vous donnera si des économies de lumière du jour sont observées.En outre, il a une fonction d'aide pour calculer le temps relatif pour vous. Vous n'avez pas besoin de faire des calculs manuels, par exemple
moment("20200105", "YYYYMMDD").fromNow();
la source
Vous êtes proche mais un peu décalé. Vous n'avez jamais besoin de calculer votre propre temps car il est le résultat de votre propre horloge. Il peut détecter si vous utilisez l'heure d'été dans votre emplacement, mais pas pour un emplacement distant produit par le décalage:
Ce sera toujours faux et hors d'une heure s'ils sont en DST. Vous avez besoin d'un compte de temps distant s'ils sont actuellement dans leur heure d'été ou non et ajustez en conséquence. essayez de calculer cela et changez votre horloge en - disons 2/1/2015 et réinitialisez l'horloge d'une heure comme si elle était en dehors de l'heure d'été. Ensuite, calculez un décalage pour un lieu qui devrait encore avoir 2 heures de retard. Il affichera une heure avant la fenêtre de deux heures. Vous devrez toujours tenir compte de l'heure et vous ajuster. Je l'ai fait pour New York et Denver et toujours aller la mauvaise (heure d'avance) à Denver.
la source
J'ai trouvé que l'utilisation de la bibliothèque Moment.js avec certains des concepts décrits ici (en comparant janvier à juin) fonctionne très bien.
Cette fonction simple retournera si le fuseau horaire dans lequel se trouve l'utilisateur respecte l'heure d'été:
Un moyen simple de vérifier que cela fonctionne (sous Windows) est de changer votre fuseau horaire en une zone non DST, par exemple l'Arizona retournera false, alors que EST ou PST retournera true.
la source
Solution évolutive qui fonctionne dans tous les fuseaux horaires
x
le nombre attendu de millisecondes dans l'année d'intérêt sans tenir compte de l'heure d'été.y
le nombre de millisecondes depuis l' époque depuis le début de l'année de la date d'intérêt.z
le nombre de millisecondes depuis l' époque de la date et de l'heure complètest
être la soustraction des deuxx
ety
dez
:z - y - x
. Cela donne le décalage dû à l'heure d'été.t
est égal à zéro, alors DST n'est pas en vigueur. Sit
n'est pas nul, alors DST est en vigueur.Je pense que l'extrait de code ci-dessus est supérieur à toutes les autres réponses publiées ici pour de nombreuses raisons.
Cependant, si vous ne vous préparez pas pour plus de 2 périodes DST, le code ci-dessous peut être utilisé pour déterminer si DST est en vigueur en tant que booléen.
la source
J'ai récemment eu besoin de créer une chaîne de date avec UTC et DST, et sur la base de la réponse de Sheldon, j'ai mis ceci ensemble:
la source
Y a-t-il un problème lors de l'utilisation du
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Cela semble compatible avec tous les navigateurs.
la source
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Style ES6
la source