web-dev-qa-db-fra.com

Différence entre les dates en JavaScript

Comment trouver la différence entre deux dates?

54
Saranya

En utilisant l'objet Date et sa valeur en millisecondes, les différences peuvent être calculées:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var d = (b-a); // Difference in milliseconds.

Vous pouvez obtenir le nombre de secondes (nombre entier/entier) en divisant le nombre de millisecondes par 1000 pour le convertir en secondes, puis en convertissant le résultat en entier (cela supprime la partie décimale représentant les millisecondes):

var seconds = parseInt((b-a)/1000);

Vous pouvez alors obtenir minutes entier en divisant seconds par 60 et en le convertissant en un entier, puis hours en divisant minutes par 60 et en le convertissant en un entier, puis en unités de temps plus longues de la même manière. À partir de là, une fonction permettant d’obtenir le montant total maximum d’une unité de temps dans la valeur d’une unité inférieure et l’unité inférieure restante peut être créée:

function get_whole_values(base_value, time_fractions) {
    time_data = [base_value];
    for (i = 0; i < time_fractions.length; i++) {
        time_data.Push(parseInt(time_data[i]/time_fractions[i]));
        time_data[i] = time_data[i] % time_fractions[i];
    }; return time_data;
};
// Input parameters below: base value of 72000 milliseconds, time fractions are
// 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). 
console.log(get_whole_values(72000, [1000, 60]));
// -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.

Si vous vous demandez quels sont les paramètres d'entrée fournis ci-dessus pour le second objet Date are, reportez-vous à leurs noms ci-dessous:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

Comme indiqué dans les commentaires de cette solution, vous n'avez pas nécessairement besoin de fournir toutes ces valeurs, sauf si elles sont nécessaires pour la date que vous souhaitez représenter.

89
Sampson

J'ai trouvé ceci et cela fonctionne bien pour moi:

Calcul de la différence entre deux dates connues

Malheureusement, calculer un intervalle de dates, tel que des jours, des semaines ou des mois, entre deux dates connues n'est pas aussi facile, car vous ne pouvez pas simplement ajouter des objets Date ensemble. Afin d'utiliser un objet Date dans n'importe quel type de calcul, nous devons d'abord récupérer la valeur interne en millisecondes de la Date, qui est stockée sous la forme d'un entier grand. La fonction à utiliser est Date.getTime (). Une fois que les deux dates ont été converties, la soustraction de la dernière date de la précédente renvoie la différence en millisecondes. L'intervalle souhaité peut ensuite être déterminé en divisant ce nombre par le nombre correspondant de millisecondes. Par exemple, pour obtenir le nombre de jours pour un nombre donné de millisecondes, nous diviserions par 86 400 000 le nombre de millisecondes d'un jour (1000 x 60 secondes x 60 minutes x 24 heures):

Date.daysBetween = function( date1, date2 ) {
  //Get 1 day in milliseconds
  var one_day=1000*60*60*24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date2_ms - date1_ms;

  // Convert back to days and return
  return Math.round(difference_ms/one_day); 
}

//Set the two dates
var y2k  = new Date(2000, 0, 1); 
var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate());
var today= new Date();
//displays 726
console.log( 'Days since ' 
           + Jan1st2010.toLocaleDateString() + ': ' 
           + Date.daysBetween(Jan1st2010, today));

L'arrondi est facultatif, selon que vous souhaitiez des jours partiels ou non.

Référence

4
Adrian P.
    // This is for first date
    first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date Epoch object
    document.write((first.getTime())/1000); // get the actual Epoch values
    second = new Date(2012, 03, 08, 15, 30, 10); // Get the first date Epoch object
    document.write((second.getTime())/1000); // get the actual Epoch values
    diff= second - first ;
    one_day_Epoch = 24*60*60 ;  // calculating one Epoch
    if ( diff/ one_day_Epoch > 365 ) // check , is it exceei
    {
    alert( 'date is exceeding one year');
    }
3
Pavunkumar

Cette réponse, basée sur une autre (lien à la fin), concerne la différence entre deux dates.
Vous pouvez voir comment cela fonctionne parce que c’est simple, cela implique également de scinder la différence en
unités de temps (une fonction que j'ai créée) et conversion en UTC pour résoudre les problèmes de fuseau horaire.

function date_units_diff(a, b, unit_amounts) {
    var split_to_whole_units = function (milliseconds, unit_amounts) {
        // unit_amounts = list/array of amounts of milliseconds in a
        // second, seconds in a minute, etc., for example "[1000, 60]".
        time_data = [milliseconds];
        for (i = 0; i < unit_amounts.length; i++) {
            time_data.Push(parseInt(time_data[i] / unit_amounts[i]));
            time_data[i] = time_data[i] % unit_amounts[i];
        }; return time_data.reverse();
    }; if (unit_amounts == undefined) {
        unit_amounts = [1000, 60, 60, 24];
    };
    var utc_a = new Date(a.toUTCString());
    var utc_b = new Date(b.toUTCString());
    var diff = (utc_b - utc_a);
    return split_to_whole_units(diff, unit_amounts);
}

// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
   /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

Comment fonctionne mon code ci-dessus

Une différence date/heure, exprimée en millisecondes, peut être calculée à l'aide de l'objet Date :

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.

var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.

Ensuite, pour calculer le nombre de secondes dans cette différence, divisez-le par 1000 pour le convertir.
millisecondes en secondes, puis changez le résultat en entier (nombre entier) à supprimer
les millisecondes (fraction de la décimale): var seconds = parseInt(diff/1000).
En outre, je pourrais obtenir des unités de temps plus longues en utilisant le même processus, par exemple:
- (entier) minutes, en divisant secondes par 60 et en transformant le résultat en entier,
- heures, en divisant minutes par 60 et en transformant le résultat en entier.

J'ai créé une fonction pour faire ce processus de scission de la différence en
unités de temps entières, nommées split_to_whole_units, avec cette démo:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

Cette réponse est basée sur cet autre .

1
Edward

Si vous recherchez une différence exprimée par une combinaison d'années, de mois et de jours, je suggérerais cette fonction:

function interval(date1, date2) {
    if (date1 > date2) { // swap
        var result = interval(date2, date1);
        result.years  = -result.years;
        result.months = -result.months;
        result.days   = -result.days;
        result.hours  = -result.hours;
        return result;
    }
    result = {
        years:  date2.getYear()  - date1.getYear(),
        months: date2.getMonth() - date1.getMonth(),
        days:   date2.getDate()  - date1.getDate(),
        hours:  date2.getHours() - date1.getHours()
    };
    if (result.hours < 0) {
        result.days--;
        result.hours += 24;
    }
    if (result.days < 0) {
        result.months--;
        // days = days left in date1's month, 
        //   plus days that have passed in date2's month
        var copy1 = new Date(date1.getTime());
        copy1.setDate(32);
        result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate();
    }
    if (result.months < 0) {
        result.years--;
        result.months+=12;
    }
    return result;
}

// Be aware that the month argument is zero-based (January = 0)
var date1 = new Date(2015, 4-1, 6);
var date2 = new Date(2015, 5-1, 9);

document.write(JSON.stringify(interval(date1, date2)));

Cette solution traitera les différences bissextiles (29 février) et de longueur en mois de manière naturelle (je pense). 

Ainsi, par exemple, l'intervalle entre le 28 février 2015 et le 28 mars 2015 sera considéré comme exactement un mois et non pas 28 jours. Si ces deux jours sont en 2016, la différence sera toujours exacte d'un mois et non de 29 jours. 

Les dates avec exactement le même mois et le même jour, mais une année différente, auront toujours une différence d'un nombre exact d'années. Ainsi, la différence entre 2015-03-01 et 2016-03-01 sera exactement d'un an, et non d'un an et d'un jour (car 365 jours sont considérés comme un an). 

1
trincot
Date.prototype.addDays = function(days) {

   var dat = new Date(this.valueOf())
   dat.setDate(dat.getDate() + days);
   return dat;
}

function getDates(startDate, stopDate) {

  var dateArray = new Array();
  var currentDate = startDate;
  while (currentDate <= stopDate) {
    dateArray.Push(currentDate);
    currentDate = currentDate.addDays(1);
  }
  return dateArray;
}

var dateArray = getDates(new Date(), (new Date().addDays(7)));

for (i = 0; i < dateArray.length; i ++ ) {
  //  alert (dateArray[i]);

    date=('0'+dateArray[i].getDate()).slice(-2);
    month=('0' +(dateArray[i].getMonth()+1)).slice(-2);
    year=dateArray[i].getFullYear();
    alert(date+"-"+month+"-"+year );
}
0
user3230982
var DateDiff = function(type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    var returns = -1;

    switch(type){
        case 'm': case 'mm': case 'month': case 'months':
            returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
            break;
        case 'y': case 'yy': case 'year': case 'years':
            returns = years;
            break;
        case 'd': case 'dd': case 'day': case 'days':
            returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
            break;
    }

    return returns;

}

Usage

var qtMonths = DateDiff ('mm', nouvelle date ('2015-05-05'), nouvelle date ());

var qtYears = DateDiff ('yy', nouvelle date ('2015-05-05'), nouvelle date ());

var qtDays = DateDiff ('dd', nouvelle date ('2015-05-05'), nouvelle date ());

OR

var qtMonths = DateDiff ('m', nouvelle date ('2015-05-05'), nouvelle date ()); // m || y || ré

var qtMonths = DateDiff ('mois', nouvelle date ('2015-05-05'), nouvelle date ()); // mois || année || journée

var qtMonths = DateDiff ('mois', nouvelle date ('2015-05-05'), nouvelle date ()); // mois || années || journées

...

var DateDiff = function (type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/)
        return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
    else if(['y', 'yy', 'year', 'years'].includes(type))
        return years;
    else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/)
        return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
    else
        return -1;

}
0
user3245067