Wie berechnet man die Datumsdifferenz in JavaScript?


181

Ich möchte die Datumsdifferenz in Tagen, Stunden, Minuten, Sekunden, Millisekunden und Nanosekunden berechnen. Wie kann ich es tun?



1
Die folgenden Lösungen werden unterbrochen, wenn sich die beiden beteiligten Daten in unterschiedlichen Zeitzonen befinden. Weitere Informationen finden Sie in der Frage unter stackoverflow.com/questions/3224834/… .
Shyam Habarakada

Antworten:


219

Angenommen, Sie haben zwei DateObjekte , können Sie sie einfach subtrahieren, um die Differenz in Millisekunden zu erhalten:

var difference = date2 - date1;

Von dort aus können Sie mithilfe einfacher Arithmetik die anderen Werte ableiten.


38
Das ist also die richtige Antwort. Beispiel: Um eine Differenz in Tagen zu erhalten Math.floor((date2 - date1) / (1000*60*60*24)), stellen Sie den Nenner ein (für die Differenz in einer anderen Einheit den Basiswert in ms).
Trisweb

32
Es gibt keine "einfache" Arithmetik zum Umrechnen von Millisekunden in Jahre. Sie müssen das Bissextiljahr und die Zeitzone kennen und einige Tage haben 23 oder 25 Stunden. Einige Jahre haben 365,25 Tage, daher gibt es hier keine einfache Arithmetik (immer noch auf der Suche nach einer genauen Lösung).
Alexandre Salomé

6
@Alexandre: Die Frage wurde seit Jahren nicht mehr gestellt. In der Tat ist die Berechnung von Jahresdifferenzen nicht trivial. Für Tage ist es jedoch richtig, vorausgesetzt, die Daten liegen in derselben Zeitzone (eine nicht unangemessene Annahme). Soweit ich weiß, ist ein Tag als 24 Stunden definiert, und jede Abweichung aufgrund der Sommerzeit ist tatsächlich ein Wechsel der Zeitzonen. Wenn Sie nicht bereits zwischen Zeitzonen unterscheiden, versetzt Sie der Versuch, einen Zeitunterschied herauszufinden, in eine Welt voller Verletzungen, nicht zuletzt, weil die Sommerzeitumschaltung die Zeit wiederholt. Bleiben Sie jedoch in einer Zeitzone und alles funktioniert.
icktoofay

12
@ trisweb - selbst etwas so Einfaches wie das Ermitteln eines Unterschieds in Tagen ist komplexer als Ihr Kommentar. Wie viele Tage zwischen Dienstag 22 Uhr und Mittwoch 9 Uhr? Ihr Algorithmus sagt 0. Andere könnten denken 1.
RobG

@ RobG-Relativisten denken vielleicht sogar mehr als 1 oder weniger als 0. Es hängt alles vom Beobachter ab.
Unschuldiger Zuschauer

78
var DateDiff = {

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}

var dString = "May, 20, 1984";

var d1 = new Date(dString);
var d2 = new Date();

document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));

Codebeispiel von hier .


Dies gibt nur die Datumsdifferenz im angegebenen Format zurück, wenn sie als einzelner Zähler verwendet wird. Wenn Sie beispielsweise 3 Monate, 4 Tage und 5 Stunden möchten, werden diese Ergebnisse NICHT angezeigt. Mehr in der Linie von 3 Monaten 96 Tagen und vielen Stunden.
Joris Kroos

30

Eine andere Lösung besteht darin, die Differenz in ein neues Datumsobjekt zu konvertieren und das Jahr (ab 1970), den Monat, den Tag usw. dieses Datums abzurufen.

var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)

console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3

console.log(diff.getUTCMonth()); // Gives month count of difference
// 6

console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4

Der Unterschied ist also wie "3 Jahre und 6 Monate und 4 Tage". Wenn Sie einen Unterschied in einem für Menschen lesbaren Stil machen möchten, kann dies Ihnen helfen.


Es ist nicht die Bedeutung! Wir wollen den GANZEN Unterschied! In diesem Beispiel beträgt der Unterschied in Tagen 1281, nicht 4!
chaim.dev

3
@ chaim.dev "Wenn Sie einen menschlich lesbaren Stil unterscheiden möchten, kann Ihnen das helfen."
Murat Çorlu

7
Dies ist nicht zuverlässig. Unterschiedliche Monatslängen oder Schaltjahre und andere Anomalien werden nicht berücksichtigt.
Marc Durdin

2
Danke Murat, diese Lösung hat mein Problem gelöst. Was ich wirklich will, dass es genauso funktionieren muss wie PHP.
Ritesh Patadiya

27

Ausdrücke wie "Unterschied in Tagen" sind niemals so einfach, wie sie scheinen. Wenn Sie folgende Daten haben:

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00

Der Zeitunterschied beträgt 2 Minuten. Sollte der "Unterschied in Tagen" 1 oder 0 sein? Ähnliche Probleme treten bei jedem Ausdruck des Unterschieds in Monaten, Jahren oder was auch immer auf, da Jahre, Monate und Tage unterschiedlich lang und zu unterschiedlichen Zeiten sind (z. B. ist der Tag, an dem die Sommerzeit beginnt, 1 Stunde kürzer als gewöhnlich und zwei Stunden kürzer als der Tag, an dem die Sommerzeit beginnt es endet).

Hier ist eine Funktion für eine Differenz in Tagen, die die Zeit ignoriert, dh für die oben genannten Daten gibt sie 1 zurück.

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.

   Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}

Dies kann prägnanter sein:

/*  Return number of days between d0 and d1.
**  Returns positive if d0 < d1, otherwise negative.
**
**  e.g. between 2000-02-28 and 2001-02-28 there are 366 days
**       between 2015-12-28 and 2015-12-29 there is 1 day
**       between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
**       between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**        
**  @param {Date} d0  - start date
**  @param {Date} d1  - end date
**  @returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
  var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
  return Math.round(diff/8.64e7);
}

// Simple formatter
function formatDate(date){
  return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}

// Examples
[[new Date(2000,1,28), new Date(2001,1,28)],  // Leap year
 [new Date(2001,1,28), new Date(2002,1,28)],  // Not leap year
 [new Date(2017,0,1),  new Date(2017,1,1)] 
].forEach(function(dates) {
  document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
                 ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});


1
@ rudeovskizebear - in IE, Firefox und Safari getestet, funktioniert einwandfrei. Es verwendet grundlegendes ECMAScript, von dem ich erwarten würde, dass es in jedem Browser funktioniert. Was funktioniert bei Ihnen nicht?
RobG

Ich habe es auf eine Testseite gestellt, und es hat in Chrom gut funktioniert, aber ich habe in IE9 und dem neuesten FF
mnsr

@ RafiB. - Ich weiß nicht, wie Sie denken, dass einer genauer ist als der andere. Sie machen im Wesentlichen dasselbe, dh sie berechnen die Differenz in ganzen Tagen anhand eines UTC-Zeitwerts. Die Mehrdeutigkeit in der Frage wurde nicht geklärt. Wenn dies der Fall ist, kann dies zu einer anderen Lösung führen.
RobG

@RobG Bitte bearbeiten Sie die Beispiele in den Kommentaren einer präziseren Lösung. Der Monat sollte '12' sein, nicht '22'
S.aad

1
@ IgorKudryashov - Entschuldigung, ich verstehe es einfach nicht. 2000 ist ein Schaltjahr, der 28. Februar 2000 bis 28. Februar 2001 sind also 366 Tage. In einem Nicht-Schaltjahr sind es 365 Tage. Ich habe einige weitere Beispiele hinzugefügt.
RobG

18
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
  var str1= time1.split('/');
  var str2= time2.split('/');

  //                yyyy   , mm       , dd
  var t1 = new Date(str1[2], str1[0]-1, str1[1]);
  var t2 = new Date(str2[2], str2[0]-1, str2[1]);

  var diffMS = t1 - t2;    
  console.log(diffMS + ' ms');

  var diffS = diffMS / 1000;    
  console.log(diffS + ' ');

  var diffM = diffS / 60;
  console.log(diffM + ' minutes');

  var diffH = diffM / 60;
  console.log(diffH + ' hours');

  var diffD = diffH / 24;
  console.log(diffD + ' days');
  alert(diffD);
}

//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
  <input type="button" 
       onclick="getDateDiff('10/18/2013','10/14/2013')" 
       value="clickHere()" />

</body>
</html>

Hilft mir nicht Kann dies nicht auf Monate oder Jahre im gleichen Ansatz verlängern.
Tomazahlin

9

Verwenden Sie Moment.js für alle Ihre JavaScript-bezogenen Datums- und Zeitberechnungen

Die Antwort auf Ihre Frage lautet:

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

Vollständige Details finden Sie hier


4
Und nutzen Sie die zusätzlichen 400+ Kb für einen bloßen Datumsunterschied.
Romeo Mihalcea

@RomeoMihalcea Aktuelle minimierte moment.js 2.22.2 mit einem Gebietsschema ist 53 KB, 17 KB gzipped. Ich verstehe Ihre Besorgnis. Es ist eine riesige Bibliothek, die für eine einfache Funktion verwendet werden kann, aber sie kümmert sich um so viele datums- / zeitbezogene Macken, dass es sich oft lohnt.
HeikoS

8
function DateDiff(date1, date2) {
    date1.setHours(0);
    date1.setMinutes(0, 0, 0);
    date2.setHours(0);
    date2.setMinutes(0, 0, 0);
    var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference 
    return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value      
}

Vielen Dank für die Lösungen :)
Bhagirathi

Die meisten Lösungen, die ich gefunden habe, funktionieren entweder nicht oder sind zu langwierig. Ihre Lösung ist die bisher einfachste und funktioniert genau wie vorgesehen! Prost :)
Bruce

Was ist, wenn ich den Unterschied genauer als eine Stunde wissen möchte? In der Post-Frage gibt es Stunden und Sekunden. Was ist mit all diesen Nullstellen?
2oppin


6
var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now

var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;

console.info(sign===1?"Elapsed: ":"Remains: ",
             days+" days, ",
             hours+" hours, ",
             minutes+" minutes, ",
             seconds+" seconds, ",
             milliseconds+" milliseconds.");

4

Entschuldigung, aber eine flache Millisekundenberechnung ist nicht zuverlässig. Vielen Dank für alle Antworten, aber einige der Funktionen, die ich ausprobiert habe, schlagen entweder am 1. Ein Datum nahe dem heutigen Datum 2. Ein Datum 1970 oder 3. Ein Datum in einem Schaltjahr fehl.

Ansatz, der für mich am besten funktioniert hat und alle Szenarien abdeckt, z. B. Schaltjahr, nahes Datum 1970, 29. Februar usw.

var someday = new Date("8/1/1985");
var today = new Date();
var years = today.getFullYear() - someday.getFullYear();

// Reset someday to the current year.
someday.setFullYear(today.getFullYear());

// Depending on when that day falls for this year, subtract 1.
if (today < someday)
{
    years--;
}
document.write("Its been " + years + " full years.");

3

Wenn Sie moment.js verwenden, ist es ziemlich einfach, Datumsunterschiede zu finden.

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

3
function DateDiff(b, e)
{
    let
        endYear = e.getFullYear(),
        endMonth = e.getMonth(),
        years = endYear - b.getFullYear(),
        months = endMonth - b.getMonth(),
        days = e.getDate() - b.getDate();
    if (months < 0)
    {
        years--;
        months += 12;
    }
    if (days < 0)
    {
        months--;
        days += new Date(endYear, endMonth, 0).getDate();
    }
    return [years, months, days];
}

[years, months, days] = DateDiff(
    new Date("October 21, 1980"),
    new Date("July 11, 2017")); // 36 8 20

3

Ich denke das sollte es tun.

let today = new Date();
let form_date=new Date('2019-10-23')
let difference=form_date>today ? form_date-today : today-form_date
let diff_days=Math.floor(difference/(1000*3600*24))

2

Auf diese Weise können Sie Unterschiede zwischen Daten ohne Framework implementieren.

function getDateDiff(dateOne, dateTwo) {
        if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){
            dateOne = new Date(formatDate(dateOne));
            dateTwo = new Date(formatDate(dateTwo));
        }
        else{
            dateOne = new Date(dateOne);
            dateTwo = new Date(dateTwo);            
        }
        let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
        let diffMonths = Math.ceil(diffDays/31);
        let diffYears = Math.ceil(diffMonths/12);

        let message = "Difference in Days: " + diffDays + " " +
                      "Difference in Months: " + diffMonths+ " " + 
                      "Difference in Years: " + diffYears;
        return message;
     }

    function formatDate(date) {
         return date.split('-').reverse().join('-');
    }

    console.log(getDateDiff("23-04-2017", "23-04-2018"));

1

function daysInMonth (month, year) {
    return new Date(year, month, 0).getDate();
}
function getduration(){

let A= document.getElementById("date1_id").value
let B= document.getElementById("date2_id").value

let C=Number(A.substring(3,5))
let D=Number(B.substring(3,5))
let dif=D-C
let arr=[];
let sum=0;
for (let i=0;i<dif+1;i++){
  sum+=Number(daysInMonth(i+C,2019))
}
let sum_alter=0;
for (let i=0;i<dif;i++){
  sum_alter+=Number(daysInMonth(i+C,2019))
}
let no_of_month=(Number(B.substring(3,5)) - Number(A.substring(3,5)))
let days=[];
if ((Number(B.substring(3,5)) - Number(A.substring(3,5)))>0||Number(B.substring(0,2)) - Number(A.substring(0,2))<0){
days=Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter
}

if ((Number(B.substring(3,5)) == Number(A.substring(3,5)))){
console.log(Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter)
}

time_1=[]; time_2=[]; let hour=[];
 time_1=document.getElementById("time1_id").value
 time_2=document.getElementById("time2_id").value
  if (time_1.substring(0,2)=="12"){
     time_1="00:00:00 PM"
  }
if (time_1.substring(9,11)==time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))
}
if (time_1.substring(9,11)!=time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))+12
}
let min=Math.abs(Number(time_1.substring(3,5))-Number(time_2.substring(3,5)))
document.getElementById("duration_id").value=days +" days "+ hour+"  hour " + min+"  min " 
}
<input type="text" id="date1_id" placeholder="28/05/2019">
<input type="text" id="date2_id" placeholder="29/06/2019">
<br><br>
<input type="text" id="time1_id" placeholder="08:01:00 AM">
<input type="text" id="time2_id" placeholder="00:00:00 PM">
<br><br>
<button class="text" onClick="getduration()">Submit </button>
<br><br>
<input type="text" id="duration_id" placeholder="days hour min">


Dieser Code gibt genaue Ergebnisse über die Anzahl der Tage, Zeit und sogar Minuten
Maximus Su

Hoffe ihr benutzt es
Maximus Su

-1

Dies sollte gut funktionieren, wenn Sie nur zeigen müssen, welche Zeit noch übrig ist, da JavaScript Frames für seine Zeit verwendet, erhalten Sie Ihre Endzeit - Die Zeit RN danach können wir sie durch 1000 teilen, da anscheinend 1000 Frames = 1 Sekunden sind. Danach können Sie die grundlegende Mathematik der Zeit verwenden, aber es gibt immer noch ein Problem mit diesem Code, da die Berechnung statisch ist und die unterschiedliche Tagessumme in einem Jahr (360/365/366) nicht kompensieren kann Wenn nach der Berechnung Null gesetzt werden soll, wenn die Zeit unter 0 liegt, hoffe ich, dass dies hilft, auch wenn es nicht genau das ist, was Sie fragen :)

var now = new Date();
var end = new Date("End Time");
var total = (end - now) ;
var totalD =  Math.abs(Math.floor(total/1000));

var years = Math.floor(totalD / (365*60*60*24));
var months = Math.floor((totalD - years*365*60*60*24) / (30*60*60*24));
var days = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24)/ (60*60*24));
var hours = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24)/ (60*60));
var minutes = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60)/ (60));
var seconds = Math.floor(totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60 - minutes*60);

var Y = years < 1 ? "" : years + " Years ";
var M = months < 1 ? "" : months + " Months ";
var D = days < 1 ? "" : days + " Days ";
var H = hours < 1 ? "" : hours + " Hours ";
var I = minutes < 1 ? "" : minutes + " Minutes ";
var S = seconds < 1 ? "" : seconds + " Seconds ";
var A = years == 0 && months == 0 && days == 0 && hours == 0 && minutes == 0 && seconds == 0 ? "Sending" : " Remaining";

document.getElementById('txt').innerHTML = Y + M + D + H + I + S + A;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.