2010-06-09 8 views
4

J'ai utilisé une petite routine bien rangé que j'ai trouvé here pour calculer la différence en jours entre deux dates dans AS3. Je reçois des résultats étranges et je me demande si l'un d'entre vous, méga-seigneurs inter-codés, peut faire la lumière?Problème de trouver la différence en jours entre deux dates

Pourquoi le premier trimestre de 2010 approche-t-il d'un jour, alors que dans tous les autres cas, la routine fonctionne bien?

Un grand merci d'avance à tous ceux qui peuvent aider!

 function countDays(startDate:Date, endDate:Date):int 
     { 
      var oneDay:int = 24*60*60*1000; // hours*minutes*seconds*milliseconds 
      var diffDays:int = Math.abs((startDate.getTime() - endDate.getTime())/(oneDay)); 
      return diffDays; 
     } 

     countDays(new Date(2010, 00, 01), new Date(2011, 00, 01)); 
     // returns 365, which is correct 

     countDays(new Date(2010, 00, 01), new Date(2010, 03, 01)); 
     // returns 89, which is 1 day short 

     countDays(new Date(2010, 03, 01), new Date(2010, 06, 01)); 
     // returns 91, which is correct 

     countDays(new Date(2010, 06, 01), new Date(2010, 09, 01)); 
     // returns 92, which is correct 

     countDays(new Date(2010, 09, 01), new Date(2011, 00, 01)); 
     // returns 92, which is correct 

Répondre

4

ci-dessous devrait fonctionner:

function countDays(startDate:Date, endDate:Date):int 
    { 
     var oneDay:int = 24*60*60*1000; // hours*minutes*seconds*milliseconds 
     var diffDays:int = Math.round(Math.abs((startDate.getTime() - endDate.getTime())/(oneDay))); 
     return diffDays; 
    } 
+0

Ce qui est couplé avec la réponse d'uhleeka (heure d'été) est l'endroit où le problème est. Il y a 90 jours au premier trimestre, mais le 14 mars 2010 ne compte que 23 heures, donc la division par votre oneDay serait de 89,96 jours. Math.floor vous laisse tomber à 89 jours. –

+0

Math.ceil ne fonctionnera pas au quatrième trimestre. En raison de DST, Q4 devrait avoir 92.04 jours, qui en utilisant Math.ceil vous donnerait 93 jours. – uhleeka

+0

Uhleeka vous avez raison. Celui-ci fonctionne pour tous les cas cependant: Math.round (Math.abs (myExpression); – James

4

Heure d'été peut-être? Vous perdez une heure au premier trimestre, votre fonction doit donc être tronquée au lieu d'arrondir.

+0

J'ai aussi rencontré un problème de problème DST lors de la conversion de la date de retour de la différence des dates - puisque le timezoneOffset est différent, je terminais avec soit la date du jour précédent, à 23 heures, ou jour correct mais à 1h selon la direction où il a traversé DST. Bit de code pour aider à cela: 'if (relativeDate.timezoneOffset! = Today.timezoneOffset) {relativeDate = nouvelle Date (relativeDate.getTime() + (relativeDate.timezoneOffset - today.timezoneOffset) * 60000); } ' –

1

Je ne sais pas. Je devinerais à une erreur d'arrondi/troncature.

Questions connexes