2010-05-02 6 views
2

Quelqu'un peut-il m'expliquer cela? De jconsole ...Pourquoi la différence entre deux dates ne me donne pas un nombre entier de jours

from = new Date('01/01/2010') 
Fri Jan 01 2010 00:00:00 GMT-0800 (PST) 

thru = new Date('06/07/2010') 
Mon Jun 07 2010 00:00:00 GMT-0700 (PST) 

(thru - from)/(1000 * 24 * 60 * 60) 
156.95833333333334 

Pourquoi ne reçois-je pas un nombre entier de jours? Comment puis-je calculer la différence entre deux dates?

merci beaucoup.

+7

Avez-vous remarqué que les fuseaux horaires de vos dates sont différents? – Amber

+0

voulait comprendre pourquoi/ce qui se passe ici afin que je puisse arrondir vers le haut ou vers le bas. Ne veulent pas se retrouver avec un jour de moins ou plus – user290870

+0

les deux sont PST, pourquoi dites-vous qu'ils sont différents – user290870

Répondre

10

Votre première date vient comme GMT -0800, le second est GMT -0700 - qui est une différence 1 heure , qui est 0,041666 d'un jour - exactement le montant que vous êtes en congé.

Cela peut être lié aux différences d'heure d'été, puisque l'une de vos dates est en janvier et l'autre en juin; Ainsi, l'un serait sur l'heure d'été et l'autre sur le jour. (Et GMT -0800 est PST quand il n'est pas en heure d'été, GMT -0700 est PST lorsque l'heure d'été.)

Vous devriez pouvoir arrondir au nombre de jours entier le plus proche, car l'heure d'été ne variera jamais plus d'une heure dans les deux sens.

+0

merci pour l'explication. Math.ceil devrait fonctionner – user290870

+0

Vous voudrez probablement arrondir réellement, puisque si la différence de l'heure d'été allait dans l'autre sens (juin à janvier, au lieu de janvier à juin), vous seriez en fait un peu au-dessus du nombre cible. – Amber

+0

Non. Lorsque nous ajustons l'horloge d'une heure (GMT -0700) Math.ceil arrondit vers le haut. Lorsque nous ajustons l'horloge d'une heure (GMT -0800), Math.ceil n'aurait aucun effet. – user290870

0

Javascript ne fait pas de calcul en virgule flottante comme on pourrait s'y attendre. Ce n'est pas assez intelligent pour arrondir à ce que vous voulez voir. Pour une solution simple faire

Math.ceil((thru - from)/(1000 * 24 * 60 * 60)) 

En second lieu, il y aura une différence en millisecondes entre les dates. Vous pouvez normaliser en utilisant

thru.setHours(0,0,0,0); 

et

from.setHours(0,0,0,0); 

avant de les utiliser

+0

Ahem - Math.ceil semble être mieux que Math.round - désolé Aussi, il ya la question de l'heure d'été, je n'ai pas remarqué que vous avez franchi – mplungjan

1

Cela devrait obtenir le nombre total de jours entre les dates, même s'il y a des différences d'heure d'été (ou juste du fuseau horaire), et il n'y a pas d'arrondi effrayant. Arrondir me fait peur parce que je prends une réponse que je n'aime pas et que je déforme, alors que cela calcule exactement ce que je voulais calculer.

// assuming this date and the other date are date only 
Date.prototype.daysSince = function(other) { 
    // get the timezone difference between then and now (in minutes) 
    var dstDiff = other.getTimezoneOffset() - this.getTimezoneOffset(); 
    // convert the timezone different to milliseconds 
    var dstDiffMs = dstDiff * 60 * 100; 
    // get the milliseconds difference between the two dates 
    var diff = this.valueOf() - other.valueOf() + dstDiffMs; 
    // convert to days 
    var days = diff/86400000; // or 60*60*24*1000 if you prefer 
    return days; 
}; 
Questions connexes