Comment obtenir la différence entre deux dates en JavaScript?

111

Je crée une application qui vous permet de définir des événements avec un laps de temps. Je souhaite renseigner automatiquement la date de fin lorsque l'utilisateur sélectionne ou modifie la date de début. Je ne peux pas vraiment comprendre, cependant, comment obtenir la différence entre les deux heures, puis comment créer une nouvelle date de fin en utilisant cette différence.

bdukes
la source

Réponses:

73

En JavaScript, les dates peuvent être transformées en millisecondes depuis l'époc en appelant la getTime()méthode ou en utilisant simplement la date dans une expression numérique.

Donc, pour obtenir la différence, soustrayez simplement les deux dates.

Pour créer une nouvelle date en fonction de la différence, passez simplement le nombre de millisecondes dans le constructeur.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

Cela devrait juste fonctionner

EDIT : Correction d'un bug signalé par @bdukes

MODIFIER :

Pour une explication du comportement, oldBegin, oldEndet newBeginsont des Datecas. L' appel des opérateurs +et -déclenchera la coulée automatique Javascript et appellera automatiquement la valueOf()méthode prototype de ces objets. Il arrive que la valueOf()méthode soit implémentée dans l' Dateobjet en tant qu'appel à getTime().

Donc en gros: date.getTime() === date.valueOf() === (0 + date) === (+date)

Vincent Robert
la source
Quel est le format requis pour que .getTime () fonctionne ... Par exemple - new Date ('22 -12-2012 00:00 '). GetTime () ne fonctionnera pas ... Des idées?
Jimmyt1988
1
Pour l'analyse des dates dans JS, je vous suggère de jeter un œil à cette question: stackoverflow.com/questions/1576753/...
Vincent Robert
8
OldBegin, oldEnd et NewBegin sont-ils censés être des Dateobjets? Il est difficile de dire quel type d'objet ils sont censés être, car la déclaration de variable est omise ici.
Anderson Green
En outre, il existe une fonction que vous pouvez utiliser pour ajouter ou soustraire des dates dans JavaScript: stackoverflow.com/a/1214753/975097
Anderson Green
Soyez prudent lorsque vous ajoutez des nombres et des jours. Voir ma réponse ci-dessous pour l'explication
Dan
24

JavaScript prend parfaitement en charge la différence de date hors de la boîte

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

Maintenant quelques pièges. Essaye ça:

console.log(a - 10);
console.log(a + 10);

Donc, si vous risquez d'ajouter un nombre et une date, convertissez numberdirectement la date en .

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

Mon premier exemple démontre la puissance de l'objet Date, mais il semble en fait être une bombe à retardement

Dan
la source
Dan, j'ai trouvé votre exemple le plus facile à comprendre et à suivre. Merci.
Melanie
5
Les «pièges» sont en fait des valeurs par défaut basées sur la spécification du langage. L'opérateur de soustraction -contraint les arguments en nombre, de sorte que la date renvoie sa valeur d'heure. L' +opérateur est surchargé, il peut donc faire de l'addition, de la coercition sur le nombre ou de la concaténation. Puisque Dates contraint à String dans ce cas, +fait la concaténation. La confusion n'est pas la faute de l'objet Date, mais de la surcharge des opérateurs.
RobG
9

Voir JsFiddle DEMO

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

pour votre code HTML:

<div id="showTime"></div>
tika
la source
4

Si vous ne vous souciez pas de la composante heure, vous pouvez utiliser .getDate()et .setDate()pour définir simplement la partie date.

Donc, pour définir votre date de fin à 2 semaines après votre date de début, faites quelque chose comme ceci:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

Pour renvoyer la différence (en jours) entre deux dates, procédez comme suit:

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

Enfin, modifions la première fonction pour qu'elle puisse prendre la valeur renvoyée par 2nd comme paramètre:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}
Joel Coehoorn
la source
31
GetDateDiff()franchira les barrières mensuelles. Par exemple, 2011/04/26 et 2011/05/01 renverront -25, mais le décalage doit être de 5 jours.
nfm
var ds = nouvelle date (2014, 0, 31, 0, 0, 0, 0); var de = nouvelle date (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) return 0
Noor
3

Merci @ Vincent Robert , j'ai fini par utiliser votre exemple de base, même si c'est en fait newBegin + oldEnd - oldBegin. Voici la solution finale simplifiée:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }
bdukes
la source
1
Il est bon d'expliquer pourquoi vous utilisez getTimeparfois et parfois pas
Dan
2

En fonction de vos besoins, cette fonction calculera la différence entre les 2 jours, et retournera un résultat en jours décimal.

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}
Sparkyspider
la source
1
Placez-le dans un Math.abs()appel et vous obtiendrez toujours une décimale positive.
Koen.
1
Belle suggestion Koen. Cela donne aux gens 2 options: juste la vraie différence de date comme vous l'avez suggéré, ou une date avec le signe indiquant si la différence est dans le passé ou le futur. :)
sparkyspider
Veuillez noter qu'en JavaScript, vous pouvez également ajouter / soustraire un nombre en millisecondes date.getTime()pour obtenir le temps dans le futur / passé. `var nextMinute = nouvelle date (someDate.getTime () + 60 * 1000);
Dan
C'est une faute de frappe? "entre les 2 jours". Probablement entre 2 dates.
tomazahlin
2

Si vous utilisez moment.js, il existe une solution plus simple, qui vous donnera la différence en jours sur une seule ligne de code.

moment(endDate).diff(moment(beginDate), 'days');

Des détails supplémentaires peuvent être trouvés dans la page moment.js

Bravo, Miguel

Miguel Guardo
la source
1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}
Dheerendra
la source
1

code étendu de modification alternative.

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}
NovaYear
la source
Veuillez ajouter des précisions à votre réponse et utiliser un meilleur anglais.
Fund Monica's Lawsuit
Cette solution est erronée car vous utilisez 365 jours, en négligeant les années bissextiles.
Sergey Goliney
0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}
gamit hiren
la source
0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>
Sukanya Suku
la source
0

ce code remplit la durée des années d'études lorsque vous saisissez la date de début et la date de fin (qualifier la date acquise) de l'étude et vérifiez si la durée est inférieure à un an si oui l'alerte un message prend en compte il y a trois éléments d'entrée le premier txtFromQualifDateet deuxième txtQualifDateet troisièmetxtStudyYears

il montrera le résultat du nombre d'années avec fraction

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }
shareef
la source
1
N'analysez jamais les chaînes de date pour trouver l'année car l'apparence des chaînes (en particulier les séparateurs) diffère selon les navigateurs. Utilisez getFullYearqui a été conçu pour cela. ------- Voir la bibliothèque datejs sur googlecode qui prend en charge la plupart des cas d'angle
Dan
merci pour les conseils @Dan mais cela a fonctionné et testé pour moi sur un vrai projet gouvernemental (différents navigateurs) est-ce que la programmation faible pratique? :)
shareef
0

Si vous utilisez des objets Date, puis utilisez la getTime()fonction pour les deux dates, il vous donnera leurs heures respectives depuis le 1er janvier 1970 dans une valeur numérique. Vous pouvez alors faire la différence entre ces chiffres.

Si cela ne vous aide pas, consultez la documentation complète: http://www.w3schools.com/jsref/jsref_obj_date.asp

Aaron
la source
Oh, oui, je n'ai pas remarqué, les réponses ci-dessous datent tout au plus d'un an.
Koen.
0

Le code ci-dessous renverra les jours restants entre aujourd'hui et la date future.

Dépendances: jQuery et MomentJs.

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');
Vin S
la source
0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);
Vin S
la source
0

C'EST CE QUE J'AI FAIT SUR MON SYSTÈME.

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
Sean Cortez
la source