Question

Comment trouver la différence entre deux dates?

Était-ce utile?

La solution

En utilisant le date objet 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 (comme un entier / nombre entier) en divisant les millisecondes par 1000 pour convertir en secondes convertir le résultat en entier (ce qui supprime la partie décimale représentant les millisecondes):

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

Vous pouvez ensuite obtenir toute minutes en divisant par 60 seconds et la convertir en un entier, puis en divisant hours minutes par 60 et la convertir en un entier, unités de temps plus longues de la même manière. De là, une fonction pour obtenir la totalité du montant maximum d'une unité de temps dans la valeur d'une unité inférieure et l'unité inférieure reste peut être créé:

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 ci-dessus pour la condition seconde date objet sont, voir leurs noms ci-dessous:

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

Comme il est indiqué dans les commentaires de cette solution, vous ne devez pas nécessairement de fournir toutes ces valeurs sauf si elles sont nécessaires à la date que vous souhaitez représenter.

Autres conseils

J'ai trouvé cela et il fonctionne très bien pour moi:

Calcul de la différence entre deux dates connues

Malheureusement, le calcul d'un intervalle de date comme les jours, semaines ou mois entre deux dates connues n'est pas aussi facile parce que vous ne pouvez pas ajouter des objets Date ensemble. Pour utiliser un objet Date dans toute sorte de calcul, il faut d'abord récupérer la valeur milliseconde interne de la date, qui est stockée sous la forme d'un grand entier. La fonction de le faire est Date.getTime (). Une fois que les deux dates ont été converties, en soustrayant l'un après de la précédente retourne la différence en millisecondes. L'intervalle désiré peut alors ê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 diviser par 86.400.000, le nombre de millisecondes en 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 en option, selon que vous voulez jours partiels ou non.

de référence

    // 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');
    }

Si vous êtes à la recherche d'une différence exprimée en une combinaison d'années, de mois et de jours, je suggère 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 des années bissextiles (29 février) et les différences de longueur de mois d'une façon que nous ferions naturellement (je pense).

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

Dates avec exactement le même mois et le jour, mais différent année, aura toujours une différence d'un nombre exact d'années. Ainsi, la différence entre 01/03/2015 et 01/03/2016 sera exactement 1 an, pas 1 an et 1 jour (en raison de compter 365 jours en 1 an).

Cette réponse, basée sur un autre (lien à la fin), est la différence entre deux dates.
Vous pouvez voir comment cela fonctionne parce qu'il est simple, aussi diviser la différence comprend en
unités de temps (une fonction qui je fis) et la conversion à l'UTC pour arrêter le temps des problèmes de zone.

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 mon code ci-dessus fonctionne

Une différence de date / heure, en millisecondes, peut être calculée en utilisant la date objet:

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 travailler le nombre de secondes dans cette différence, diviser par 1000 pour convertir
millisecondes à quelques secondes, puis changer le résultat à un entier (nombre entier) pour enlever
les millisecondes (partie de la fraction de cette décimale). var seconds = parseInt(diff/1000)
De plus, je pouvais obtenir des unités plus de temps en utilisant le même procédé, par exemple:
 - (entier) minutes , divisant secondes de 60 et de changer le résultat à un entier,
 -. h , divisant minutes par 60 et en modifiant le résultat à un nombre entier

I créé une fonction pour faire de ce processus consistant à diviser la différence dans
des unités entières de temps, du nom 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 cette autre .

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 );
}
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;

}
  

Utilisation

     

var qtMonths = DateDiff ( 'mm', new Date ( '05/05/2015'), new Date ());

     

var qtYears = DateDiff ( 'yy', new Date ( '05/05/2015'), new Date ());

     

var qtDays = DateDiff ( 'dd', new Date ( '05/05/2015'), new Date ());

     
    

ou

         

var qtMonths = DateDiff ( 'm', new Date ( '05/05/2015'), new Date ()); // m || y || d

         

var qtMonths = DateDiff ( 'mois', new Date ( '05/05/2015'), new Date ()); // mois || année || jour

         

var qtMonths = DateDiff ( 'mois', new Date ( '05/05/2015'), new Date ()); // mois || années || jours

         

...

  
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;

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top