2011-09-01 9 views
1

J'utilise ce script en cours pour déterminer la différence entre deux dates:AS2: Calculer jours entre deux dates

// Slide_Tracker[?].date_int are results from the built in function getTime() 
var current_date = new Date(Slide_Tracker[i].date_int); 
var past_date:Date = new Date(Slide_Tracker[i - 1].date_int); 
var date_diff:Number = Math.round((current_date - past_date)/86400000); 

Le problème est que je veux surveiller le changement de jour physique si quelqu'un accède à l'application à 23h59 puis revint 5 minutes plus tard, cela signifierait une différence d'un jour (un nouveau jour), ce script actuel nécessite au moins 12 heures pour s'être écoulé entre deux dates pour qu'il s'annonce comme un nouveau jour.

J'ai pensé à utiliser le numéro de date, etc., mais parce que les mois et les années sont si différents, c'est une route assez complexe, il doit y avoir quelque chose de plus simple.

+0

Quelles sont les valeurs provenant des curseurs? – grapefrukt

+0

@grapefrukt millisecondes de 'getTime()' –

Répondre

1

En tant Pour votre information, la différence entre une date et minuit le matin suivant est:

// dt is the start date 
var diff:Number = 
     new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1) - dt.getTime() 

Mais il est plus facile de simplement ronde le lendemain, puis à partir de là:

var dt:Date = new Date(Slide_Tracker[i - 1].date_int); 
var past_date = // start at the next day to only deal w/ 24 hour increments 
    new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1); 
dt = new Date(Slide_Tracker[i].date_int); 
var current_date = 
    new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1); 
var date_diff:Number = Math.round((current_date.getTime() - 
            past_date.getTime())/86400000); 

Votre autre option est d'arrondir les entrées:

// rounds a timestamp *down* to the current day 
function getBaseDay(val:Number):Number 
{ 
    return Math.floor(val/86400000) * 86400000 
} 

var current_date = new Date(getBaseDay(Slide_Tracker[i].date_int)); 
var past_date:Date = new Date(getBaseDay(Slide_Tracker[i - 1].date_int)); 
var date_diff:Number = Math.round((current_date.getTime() - 
            past_date.getTime())/86400000); 
+0

Qu'est-ce que cela fait différemment? Il calcule toujours la différence de date en divisant par les millisecondes en un jour et en arrondissant ce qui signifie qu'il faut encore une demi-journée pour être passé non? –

+0

Il arrondit les deux jours jusqu'au jour le plus proche (ou vers le bas dans le deuxième exemple), ce qui signifie que s'il est 23:59 le 1er septembre, il arrondira à 0:00 le 2 septembre et s'il est 0:01 sept. 2, il sera arrondi à 0:00 Septembre 3 - un jour de différence – cwallenpoole

+0

ah ok je comprends maintenant merci –

0

Quelque chose comme cela devrait fonctionner:

public boolean isNewDay(current:Date, past:Date):Boolean 
{ 
    // check the days of the month first 
    if(current.date != past.date) 
     return true; 

    // check the months in case they came back on the same day of the next month 
    if(current.month != past.month) 
     return true; 

    // finally check the year, in case they came back on the same day the next year 
    if(current.fullYear != past.fullYear) 
     return true; 

    return false; 
} 

même si vous avez accepté la réponse, voici une fonction de mise à jour:

public function getNumberOfDays(current:Date, past:Date):int 
{ 
    // get the number of millis between the two dates 
    var millis:Number = current.time - past.time; 

    // a day in millis is 1000 (s) * 60 (m) * 60 (h) * 24 (day) 
    var day:Number = 1000 * 60 * 60 * 24; 

    // get the number of days 
    var numDays:int = int(millis/day); 

    // create midnight of the current day 
    if (numDays == 0) 
    { 
     // if our numDays is 0, check if the current date is after midnight and the 
     // previous date was before midnight the previous day, in which case, count 
     // it as another day 
     var midnight:Date = new Date(current.fullYear, current.month, current.date); 
     if (current.time > midnight.time && past.time < midnight.time) 
      numDays++; 
    } 

    return numDays; 
} 

Il fonctionne avec tous les cas de test que j'ai essayé (de minuit à 23.59.59 = 0 jours, 23,59 à 00,05 = 1 jour)

+0

Mais je veux enregistrer le nombre de jours depuis leur dernière utilisation de l'outil, donc s'ils reviennent deux mois plus tard. Ensuite, je cours à des problèmes tels que la quantité variable de jours en mois/années bissextiles .etc –