2009-06-27 2 views
1

Flex me pousse CRAZY et je pense que c'est un truc bizarre avec la façon dont il gère les années bissextiles et aucune année bissextile. Alors, voici mon exemple. J'ai la méthode dateDiff ci-dessous qui trouve le nombre de jours ou de millisecondes entre deux dates. Si je lance les trois déclarations suivantes, j'ai des problèmes étranges.Bizarre flex date date

 dateDiff("date", new Date(2010, 0,1), new Date(2010, 0, 31)); 
    dateDiff("date", new Date(2010, 1,1), new Date(2010, 1, 28)); 
    dateDiff("date", new Date(2010, 2,1), new Date(2010, 2, 31)); 
    dateDiff("date", new Date(2010, 3,1), new Date(2010, 3, 30)); 

Si vous deviez regarder les comparaisons de date ci-dessus vous attendre à obtenir 30, 27, 30, 29 comme le nombre de jours entre les dates. Ce qui est bizarre, c'est que j'obtiens 29 en comparant le 1er mars au 31 mars. Pourquoi? Est-ce que cela a quelque chose à voir avec Février ayant seulement 28 jours? Si quelqu'un a des commentaires à ce sujet, cela serait grandement apprécié.

public static function dateDiff(datePart:String, startDate:Date, endDate:Date):Number 
    { 
     var _returnValue:Number = 0; 

     switch (datePart) { 
      case "milliseconds": 
       _returnValue = endDate.time - startDate.time; 
       break; 
      case "date": 
       // TODO: Need to figure out DST problem i.e. 23 hours at DST start, 25 at end. 
       // Math.floor causes rounding down error with DST start at dayOfYear 
       _returnValue = Math.floor(dateDiff("milliseconds", startDate, endDate)/(1000 * 60 * 60 * 24)); 
       break; 
     } 

     return _returnValue; 
    } 

Répondre

4

Ce n'est pas un problème d'année bissextile, mais plutôt un problème d'heure avancée.

Pour corriger le code pour tenir compte de DST, vous devez regarder le timezoneOffset des deux dates pour déterminer si la plage de dates couvre une limite DST.

var adjustment:Number = (startDate.timezoneOffset - endDate.timezoneOffset) * 60 * 1000; 
_returnValue = endDate.time - startDate.time + adjustment; 

Cela se la différence entre les deux fuseaux horaires (en minutes), convertir cette valeur en millisecondes, puis appliquer la différence de fuseau horaire à la différence de milliseconde à « annuler » la frontière DST.

Naturellement, lorsque les deux nombres sont dans le même fuseau horaire, la valeur de réglage devient 0 et les valeurs de temps ne sont pas ajustées.

+0

C'est génial !! Merci beaucoup d'avoir posté l'exemple de code. Cela résout parfaitement mon problème. – CodeMonkey

0

Vous avez une partie de la réponse dans votre commentaire: 2010-Mar-01 00h00 jusqu'en 2010-Mar-31 00h00 est de trente jours moins une heure (parce que le 14 mars est début DST (!) en 2010). Puisque vous limitez le résultat de votre division, vous obtenez 29.

Éditer: Cette réponse est bien sûr basée sur l'hypothèse que la propriété time de Date prend en compte DST. Cela expliquerait votre problème. Je ne l'ai pas vérifié, cependant.