2010-11-05 2 views
7

J'ai une section de Javascript simple dans mon application qui a un lien "Add Day", qui ajoute 1 jour à une date. Cela fonctionne toujours parfaitement, sauf quand la date sera le 11/07/2010, et que le lien ne fonctionnera plus soudainement. C'est vraiment bizarre, car il ne raccroche qu'à la date précise du 11/07/2010.Date Javascript, est-ce mon erreur ou ai-je trouvé un bug?

Comment reproduire l'erreur:

  1. Accédez à la page here
  2. Sur un champ de date, cliquez sur "Aujourd'hui", ou tout simplement régler la date d'aujourd'hui.
  3. Cliquez sur "Ajouter jour" jusqu'à ce que vous obteniez à 11/07/2010
  4. Maintenant, en cliquant sur "Ajouter jour" ne fonctionne plus!
+0

Pas pour moi sur Chrome. Ça semble fonctionner correctement. – harpo

+1

Fonctionne pour moi (FF 3.6.12). Quel navigateur? –

+0

Fonctionne pour moi. Quel navigateur utilisez-vous? Pourriez-vous peut-être être mordu par une erreur de calcul de l'heure d'été? –

Répondre

13

Le problème est que vous ajoutez les 24 heures à la date pour ajouter un jour; L'heure d'été vous a contrarié parce que 24 heures après minuit le 7 novembre sera 23h00 (pour la deuxième fois) le 7 novembre.

+0

Et, bien sûr, ce comportement dépendra si l'heure d'été se termine le 7 novembre dans les paramètres régionaux de votre navigateur. –

+1

Belle prise. Je suis en AZ - nous n'avons pas de DST ici :) –

+0

+1 parce que je tape lent: \ – Angiosperm

1

Heure d'été. (Dans la plupart des endroits aux États-Unis) le temps revient le premier dimanche de novembre. Votre code ajoute juste une quantité de millisecondes au début du jour spécifié par la boîte de saisie, et le retour du début du jour résultant: cependant en raison de l'heure d'été, ajouter simplement des secondes et tronquer la date de cette manière ne fera jamais progresser la date .

3

D'autres ont détecté le problème.

Pour résoudre ce problème, vous pouvez utiliser le constructeur Date surchargé qui prend l'année, le mois et le jour:

var aDate = new Date(2010, 10, 07); 
var aDatePlusOneDay = new Date(aDate.getFullYear(), 
           aDate.getMonth(), 
           aDate.getDate() + 1, // HERE 
           aDate.getHours(), 
           aDate.getMinutes(), 
           aDate.getSeconds(), 
           aDate.getMilliseconds()); 

Voici une solution plus générique qui peut augmenter toute date d'un montant de milliseconde donné, en prenant des modifications à l'heure d'été en compte:

Date.addTicks = function(date, ticks) { 
    var newDate = new Date(date.getTime() + ticks); 
    var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset(); 
    return new Date(newDate.getTime() + tzOffsetDelta * 60000); 
} 

Ajout d'un jour à un objet Date est alors une question d'ajouter le nombre de millisecondes en un jour:

Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8) 

Références: