Comment calculer le nombre de jours entre deux dates


283

J'ai deux dates d'entrée tirées du contrôle Date Picker. J'ai sélectionné la date de début 2/2/2012 et la date de fin 2/7/2012. J'ai écrit le code suivant pour cela.

Je devrais obtenir un résultat de 6 mais j'obtiens 5.

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

Quelqu'un peut-il me dire comment obtenir la différence exacte?


pourquoi devriez-vous obtenir un résultat = 6 ???
07-02

1
Mais la plage de jours de 2 à 7 est 2,3,4,5,6,7 = 6 jours.
Supr

Tout en prenant la différence, je veux également considérer la date de début ...
Vaibhav Deshmukh

17
Eh bien ... pourquoi ne pas simplement ajouter 1 à la réponse?
Pointy

Le problème (s'il y a un problème) est fonctionnel et non technique. Le commentaire @Pointy est la réponse. C'est pourquoi certaines personnes demandent pourquoi nous sommes au XXIe siècle.
Leandro

Réponses:


668

http://momentjs.com/ ou https://date-fns.org/

Depuis les documents Moment:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

ou pour inclure le début:

a.diff(b, 'days')+1   // =2

Beats jouant avec les horodatages et les fuseaux horaires manuellement.

Selon votre cas d'utilisation spécifique, vous pouvez soit

  1. Utilisez a/b.startOf('day')et / ou a/b.endOf('day')pour forcer le diff à être inclusif ou exclusif aux "fins" (comme suggéré par @kotpal dans les commentaires).
  2. Set troisième argument truepour obtenir un point flottant diff que vous pouvez Math.floor, Math.ceilou Math.roundau besoin.
  3. L'option 2 peut également être accomplie en obtenant 'seconds'au lieu de 'days'puis en divisant par 24*60*60.

30
moment.js donnera une valeur négative si a <b. Ainsi, un calcul plus robuste serait: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Soyez conscient d'ignorer la partie de temps - sinon vous obtiendriez des résultats différents pour la même date mais avec des heures différentes (comme à partir d'un contrôle de sélecteur de date). utilisez moment (someDate) .startOf ('day') pour définir explicitement la partie heure à 00:00:00 avant d'effectuer un diff (ou toute autre opération sensible à la partie heure de l'objet Date / moment)
kotpal

Cela fonctionne mais ne prend pas en compte la composante temps. Essayer de faire la différence entre les deux paires suivantes: (a = "2017-12-24T00: 00: 00Z" et "b = 2017-12-31T23: 59: 59Z") et (a = "2017-12-24T23: 00 : 00Z "et b =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'days') <= 7; les deux retournent vrai. Existe-t-il un moyen d'inclure la composante temps dans le diff?
Roobie

1
+1 pour startOf () et endOf (). J'utilise cette bibliothèque depuis quelques années et je ne les avais jamais remarqués auparavant. J'ai toujours fait +1.
Mike Devenney

3
Soyez conscient que cela startOfmute le moment. Si vous ne le voulez pas, alors faites-le a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Si vous utilisez moment.js, vous pouvez le faire facilement.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

Si vous souhaitez trouver la différence entre une date donnée et la date actuelle en nombre de jours (en ignorant l'heure), assurez-vous de supprimer l'heure de l'objet moment de la date actuelle comme ci-dessous

moment().startOf('day')

Pour trouver la différence entre une date donnée et la date actuelle en nombre de jours

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();

2
asDays () m'a renvoyé quelques valeurs avec des décimales. J'utilise current.diff(given, 'days')donc ça arrondit.
Vincent

@Vincent, il semble que vous l'utilisez mal. c'est définitivement la solution la plus propre le résultat est correct par rapport à la réponse de @Supr dans laquelle a 1est perdu
Nwawel A Iroume

15

Essayer:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);

Je pense que c'est fondamentalement vrai, mais n'est-ce pas essentiellement la même chose que dans le PO?
Pointy

À cause de la façon dont il l'a écrit, je ne l'ai pas remarqué, mais oui, à peu près! : P
Richard

5
Je n'aime pas les nombres magiques ... il serait préférable que ce nombre soit décomposé en une équation qui s'explique d'elle-même
vsync

7

Essayez ceci en utilisant moment.js (Ses opérations de date assez faciles à calculer en javascript)

firstDate.diff (secondDate, 'days', false); // true | false pour la valeur de fraction

Le résultat vous donnera le nombre de jours en entier.


voici la signature: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit

1

Vous pouvez également utiliser ce code: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Cela calculera la différence entre aujourd'hui et la date que vous avez fournie.


1

Cela fonctionne pour moi:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);


1

J'ai créé une fonction réutilisable rapide dans ES6 en utilisant Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>


-1

MVC j'ai deux texte d'entrée 1: nombre de jour 2: sélecteur datetime

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

pour calculer le nombre à partir de la date, utilisez

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

pour calculer le nombre de jours entre deux dates, utilisez

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

n'oubliez pas d'ajouter http://momentjs.com/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.