2008-09-03 9 views
90

Je crée une application qui vous permet de définir des événements avec un intervalle de temps. Je veux remplir automatiquement la date de fin lorsque l'utilisateur sélectionne ou modifie la date de début. Cependant, je n'arrive pas à comprendre comment obtenir la différence entre les deux temps, et comment créer une nouvelle date de fin en utilisant cette différence.Comment obtenir la différence entre deux dates en JavaScript?

+0

double possible de [comparer deux dates avec JavaScript] (https://stackoverflow.com/questions/492994/compare -deux-dates-avec-javascript) –

Répondre

63

En JavaScript, les dates peuvent être transformées en nombre de millisecondes depuis l'epoc en appelant la méthode getTime()ou en utilisant simplement la date dans une expression numérique. Pour obtenir la différence, il suffit de soustraire les deux dates.

Pour créer une nouvelle date basée sur la différence, il suffit de transmettre le nombre de millisecondes dans le constructeur.

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

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

Cela devrait fonctionner

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

EDIT:

Pour une explication du comportement, oldBegin, oldEnd et newBegin sont Date instances. Les opérateurs d'appel + et - déclencheront le cast automatique Javascript et appelleront automatiquement la méthode prototype valueOf() de ces objets. Il arrive que la méthode valueOf() est implémentée dans l'objet Date en tant qu'appel à getTime().

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

+7

Pas assez de réponse. Comment appliquer 'getTime()'? – Gruber

+2

Avez-vous essayé date.getTime()? –

+0

Quel est le format requis pour que .getTime() fonctionne ... Par exemple - new Date ('22 -12-2012 00:00 '). GetTime() ne fonctionne pas ... Des idées? – Jimmyt1988

0

Si vous utilisez des objets Date, puis utilisez la fonction getTime() pour les deux dates, il vous donnera leurs temps respectifs depuis le 1er janvier 1970 à une valeur numérique. Vous pouvez ensuite 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

+2

Je ne pense pas que le référencement à w3schools.com est trop bon: http://w3fools.com/ –

+0

Oh, oui, n'a pas remarqué, les réponses ci-dessous sont au plus un an et demi . –

4

Si vous ne se soucient pas de la composante de temps, vous pouvez utiliser .getDate() et .setDate() juste régler la partie date.

Donc, pour régler votre date de fin à 2 semaines après la date de début, faire quelque chose comme ceci:

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

Pour retourner la différence (en jours) entre deux dates, faites ceci:

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

Enfin, modifions la première fonction de sorte qu'il peut prendre la valeur retournée par 2 comme paramètre:

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

'GetDateDiff()' dépassera les barrières mensuelles. Par exemple, 2011/04/26 et 2011/05/01 renverront -25, mais le décalage devrait être de 5 jours. – nfm

+0

var ds = new Date (2014, 0, 31, 0, 0, 0, 0); var de = new Date (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) return 0 – Noor

3

Remerciez s @Vincent Robert, j'ai fini par utiliser votre exemple de base, mais il est en réalité 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)); 
    } 
+1

Il est bon d'expliquer pourquoi vous utilisez parfois 'getTime' et parfois pas – Dan

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') 
} 
0

ce code remplit la durée des années d'étude lorsque vous entrez la date de début et de fin (qualifier la date accumulés par) d'étude et de vérifier si la durée de moins d'un an si oui l'alerte un message prendre à l'esprit il y a trois éléments d'entrée de la première et la deuxième txtFromQualifDatetxtQualifDate et troisième txtStudyYears

il montrera résultat de plusieurs années avec la 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; 
     } 
    } 
+1

Jamais jamais analyser les chaînes de date pour trouver l'année parce que l'apparence des chaînes (en particulier les séparateurs) diffère entre les navigateurs. Utilisez 'getFullYear' qui a été conçu pour cela. ------- Voir la bibliothèque datejs sur googlecode qui supporte éventuellement la plupart des cas d'angle – Dan

+0

merci pour les conseils @Dan mais ça a fonctionné et testé pour moi sur le vrai projet goverment (différents navigateurs) est-ce que la programmation est faible? :) – shareef

2

En fonction de vos besoins, cette fonction calcule la différence entre les 2 jours et renvoie un résultat en jours décimaux.

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

Placez-le dans un appel 'Math.abs()', et vous obtiendrez toujours un nombre décimal positif. –

+1

Belle suggestion Koen. Cela donne aux gens 2 options: juste la vraie date diff comme vous l'avez suggéré, ou un datediff avec le signe indiquant si la différence est dans le passé ou dans le futur. :) – Spider

+0

S'il vous plaît noter qu'en JavaScript, vous pouvez également ajouter/soustraire un nombre en millisecondes à 'date.getTime()' pour obtenir l'heure dans le futur/passé. 'var nextMinute = new Date (someDate.getTime() + 60 * 1000); – Dan

18

JavaScript supporte parfaitement la différence de date 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. Essayez ceci:

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

Donc, si vous avez le risque d'ajouter un numéro et la date, date à convertir number directement.

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

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

+0

Dan, j'ai trouvé votre exemple le plus facile à comprendre et à suivre. Merci. – Melanie

+4

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 à nombre, de sorte que la date renvoie sa valeur d'heure. L'opérateur '+ 'est surchargé, donc peut-être addition, coercition au nombre ou concaténation. Puisque les dates coercent à Chaîne 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

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

See JsFiddle DEMO

var date1 = new Date();  
    var date2 = new Date("2015/07/30 21:59:00"); 
    showDiff(); 

function showDiff(date1, date2){ 

    var diff = (date2 - date1)/1000; 
    var 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> 
0

modificitaion alternatif code étendu ..

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

Veuillez ajouter des précisions à votre réponse et utilisez un meilleur anglais. –

+0

Cette solution est fausse parce que vous utilisez 365 jours, en négligeant les années bissextiles. –

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> 
2

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

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

Des détails supplémentaires sont disponibles dans le moment.js page

Cheers, Miguel

Questions connexes