Sur la base du commentaire de Matt Johanson sur la solution fournie par Sheldon Griffin, j'ai créé le code suivant :
Date.prototype.stdTimezoneOffset = function() {
var fy=this.getFullYear();
if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {
var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];
for(var mi=0;mi<12;mi++) {
var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
if (offset!=maxOffset) {
maxOffset=Math.max(maxOffset,offset);
break;
}
}
Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
}
return Date.prototype.stdTimezoneOffset.cache[fy];
};
Date.prototype.stdTimezoneOffset.cache={};
Date.prototype.isDST = function() {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
};
Il essaie d'obtenir le meilleur de tous les mondes en tenant compte de tous les commentaires et des réponses suggérées précédemment et en le précisant :
1) Met en cache le résultat de l'année stdTimezoneOffset afin que vous n'ayez pas besoin de le recalculer lorsque vous testez plusieurs dates de la même année.
2) Il ne suppose pas que l'heure d'été (si elle existe) soit nécessairement en juillet, et fonctionnera même si, à un moment donné et à un endroit donné, il s'agit de n'importe quel mois. Cependant, du point de vue des performances, il fonctionnera plus rapidement si le mois de juillet (ou les mois voisins) est effectivement l'heure d'été.
3) Dans le pire des cas, il comparera le getTimezoneOffset du premier de chaque mois. [et faire cela une fois par année testée].
L'hypothèse qu'il fait toujours est que la période de l'heure d'été est plus grande qu'un seul mois.
Si quelqu'un veut supprimer cette hypothèse, il peut changer la boucle en quelque chose qui ressemble davantage à la solution fournie par Aaron Cole - mais je continuerais à sauter une demi-année en avant et à sortir de la boucle lorsque deux décalages différents sont trouvés].