56 votes

Différence de date en Javascript (en ignorant l'heure)

Je suis en train d'écrire une location de matériel d'application, où les clients sont facturés des frais de location d'équipement en fonction de la durée (en jours) de la location. Donc, en gros, (tarif journalier * nombre de jours) = total des frais.

Pour des informations instantanées sur le côté client, je suis en train d'utiliser Javascript pour calculer la différence de deux dates du calendrier. J'ai cherché partout, mais rien de ce que j'ai trouvé est tout à fait ce que je cherche. La plupart des solutions que j'ai vu sont de la forme:

function dateDiff1(startDate, endDate) {
    return ((endDate.getTime() - startDate.getTime()) / 1000*60*60*24);
}

Mon problème est que l'équipement peut être vérifié et renvoyé à tout moment de la journée au cours de ces deux dates sans frais supplémentaires. Le code ci-dessus est le calcul du nombre de périodes de 24 heures entre les deux dates, quand je suis vraiment intéressé par le nombre de jours de calendrier.

Par exemple, si quelqu'un extrait de l'équipement à 6h du matin, le 6 juillet, et l'a renvoyée à 10 heures du soir, le 7 juillet, le code ci-dessus calcule que plus d'une période de 24 heures avaient passé, et serait de retour 2. Le résultat souhaité est 1, puisque seule une date du calendrier est écoulé (c'est à dire de la 6e à la 7e).

Le plus proche de la solution que j'ai trouvé est cette fonction:

function dateDiff2(startDate, endDate) {
    return endDate.getDate() - startDate.getDate();
}

qui fait exactement ce que je veux, aussi longtemps que les deux dates sont dans le même mois. Cependant, depuis getDate() ne renvoie le jour du mois (c'est à dire de 1 à 31), il ne fonctionne pas lorsque les dates de durée de plusieurs mois (par exemple, le 31 juillet à août 1 est de 1 jour, mais au-dessus de la calcuates 1 - 31, ou -29).

Sur le backend, en PHP, je suis en utilisant gregoriantojd(), qui semble très bien fonctionner (voir ce post pour un exemple). Je ne peux pas trouver une solution équivalente en Javascript.

N'importe qui ont des idées?

47voto

Ed Poor Points 783

Si vous voulez des journées entières pour votre exemple de location d'appareil photo étudiant ...

 function daysBetween(first, second) {

    // Copy date parts of the timestamps, discarding the time parts.
    var one = new Date(first.getFullYear(), first.getMonth(), first.getDate());
    var two = new Date(second.getFullYear(), second.getMonth(), second.getDate());

    // Do the math.
    var millisecondsPerDay = 1000 * 60 * 60 * 24;
    var millisBetween = two.getTime() - one.getTime();
    var days = millisBetween / millisecondsPerDay;

    // Round down.
    return Math.floor(days);
}
 

19voto

sheriffpony Points 106

Je viens d'avoir ce problème et résolu après avoir trouvé cette question, alors je suis revenu à poster cela. Cela donnera le nombre total de jours indépendamment du temps. Et l'heure d'été ne le gâche pas:

 date1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate());
date2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate());
var ms = Math.abs(date1-date2);
return Math.floor(ms/1000/60/60/24); //floor should be unnecessary, but just in case
 

L'astuce consiste à convertir en une date UTC sans connaître les heures des dates d'origine.

10voto

mga911 Points 772

Ce que je voudrais faire est de définir les deux dates du temps, pour le même temps. Par exemple, de définir la date de fin de l'heure à 12:00 et de startDate est temps de 12:00 am aussi. Alors d'obtenir la différence entre eux.

Sur une note de côté, car je suis moi aussi dans la location de matériel, logiciel de l'industrie, il semble que vous êtes de perdre des revenus de location en ne comptant pas les heures. Par votre exemple, si quelqu'un ramassé de l'équipement, le 6 juillet, à 6 heures du matin et l'a retourné le 7 juillet à 10h. Ils ont eu deux jours complets à l'utilisation du matériel et, éventuellement, entraîner un excès de compteur de charge trop...

10voto

Marlin Mixon Points 89

Il y a un bug dans les solutions!

Cela s'applique à la date de différences où le temps n'est pas pris en compte ET que vous voulez un résultat sous forme d'entier, qui est, nombre entier de jours.

Dans la plupart des exemples ci-dessus, nous voyons les Mathématiques.chaussée d'autres instances que j'ai vu de Mathématiques.ceil d'autres endroits aussi bien. Ceux-ci sont fait pour arrondir le résultat à un nombre entier de jours. Le problème, c'est l'heure d'été de donner un mauvais résultat dans la chute à l'aide des Mathématiques.ceil-Votre résultat sera un jour trop gros ou au printemps si vous utilisez les Maths.l'étage vous sera désactivé par un jour de trop peu. Suffit d'utiliser les Mathématiques.ronde car 1 heure de toute façon ne va pas fausser le résultat.

function dateDiff(dateEarlier, dateLater) {
    var one_day=1000*60*60*24
    return (  Math.round((dateLater.getTime()-dateEarlier.getTime())/one_day)  );
}

6voto

Blixt Points 23266

Étant donné que le jour julien est effectivement le nombre de jours (et dans certains cas également la fraction de nombre de jours) depuis une certaine date, il est pratiquement identique à un horodatage UNIX, présenté différemment. Vous pouvez obtenir le nombre de jours entiers depuis 1970 comme suit:

 Date.prototype.getWholeDays = function () {
    return Math.floor(new Date() / 1000*60*60*24);
};

function dateDiff(startDate, endDate) {
    return endDate.getWholeDays() - startDate.getWholeDays();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X