Wie erhalte ich den Unterschied zwischen zwei Daten in JavaScript?


110

Ich erstelle eine Anwendung, mit der Sie Ereignisse mit einem Zeitrahmen definieren können. Ich möchte das Enddatum automatisch eingeben, wenn der Benutzer das Startdatum auswählt oder ändert. Ich kann jedoch nicht genau herausfinden, wie man den Unterschied zwischen den beiden Zeiten ermittelt und wie man dann mit diesem Unterschied ein neues Enddatum erstellt.

Antworten:


72

In JavaScript können Datumsangaben durch Aufrufen der getTime()Methode oder in die Anzahl der Millisekunden seit dem Epoc umgewandelt werden Verwenden des Datums in einem numerischen Ausdruck .

Um den Unterschied zu erhalten, subtrahieren Sie einfach die beiden Daten.

Um ein neues Datum basierend auf der Differenz zu erstellen, übergeben Sie einfach die Anzahl der Millisekunden im Konstruktor.

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

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

Das sollte einfach funktionieren

BEARBEITEN : Fehler behoben, auf den @bdukes hingewiesen hat

EDIT :

Für eine Erklärung des Verhaltens, oldBegin, oldEnd, und newBeginsind DateInstanzen. Aufruf Betreiber +und -wird Javascript Auto - casten auslösen und wird das automatisch aufrufen valueOf()Prototyp Verfahren dieser Objekte. Es kommt vor, dass die valueOf()Methode Dateals Aufruf von im Objekt implementiert ist getTime().

Also im Grunde genommen: date.getTime() === date.valueOf() === (0 + date) === (+date)


Welches Format ist erforderlich, damit .getTime () funktioniert ... Zum Beispiel - neues Datum ('22 -12-2012 00:00 '). GetTime () funktioniert nicht ... Irgendwelche Ideen?
Jimmyt1988

1
Für die Datumsanalyse in JS schlage ich vor, dass Sie sich diese Frage ansehen
Vincent Robert

8
Sollen OldBegin, oldEnd und NewBegin DateObjekte sein? Es ist schwer zu sagen, um welche Art von Objekt es sich handelt, da die Variablendeklaration hier weggelassen wird.
Anderson Green

Es gibt auch eine Funktion, mit der Sie Daten in JavaScript hinzufügen oder entfernen können
Anderson Green

Seien Sie vorsichtig beim Hinzufügen von Zahlen und Tagen. Siehe meine Antwort unten für eine Erklärung
Dan

24

JavaScript unterstützt die Datumsdifferenz sofort

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

Nun einige Fallstricke. Versuche dies:

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

Wenn Sie also das Risiko haben, eine Zahl und ein Datum hinzuzufügen, konvertieren Sie das Datum numberdirekt in.

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

Mein erstes Beispiel zeigt die Kraft des Datumsobjekts, aber es scheint tatsächlich eine Zeitbombe zu sein


Dan, ich fand dein Beispiel am einfachsten zu verstehen und zu befolgen. Vielen Dank.
Melanie

5
Die "Fallstricke" sind tatsächlich Standardeinstellungen, die auf der Sprachspezifikation basieren. Der Subtraktionsoperator -zwingt die Argumente zur Zahl, sodass das Datum seinen Zeitwert zurückgibt. Der +Operator ist überlastet, daher kann es zu Addition, Zwang zur Nummerierung oder Verkettung kommen. Da Dates in diesem Fall zu String gezwungen werden, +erfolgt die Verkettung. Verwirrung ist nicht die Schuld des Date-Objekts, sondern der Überladung von Operatoren.
RobG

9

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

für Ihren HTML-Code:

<div id="showTime"></div>

4

Wenn Sie sich nicht für die Zeitkomponente interessieren, können Sie .getDate()und verwenden.setDate() einfach einstellen.

Gehen Sie folgendermaßen vor, um Ihr Enddatum auf 2 Wochen nach Ihrem Startdatum festzulegen:

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

Gehen Sie folgendermaßen vor, um die Differenz (in Tagen) zwischen zwei Daten zurückzugeben:

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

Zum Schluss ändern wir die erste Funktion so, dass der von 2nd zurückgegebene Wert als Parameter verwendet werden kann:

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

31
GetDateDiff()wird über Monatsgrenzen hinweg brechen. Zum Beispiel werden 2011/04/26 und 2011/05/01 -25 zurückgeben, aber der Offset sollte 5 Tage betragen.
NFM

var ds = neues Datum (2014, 0, 31, 0, 0, 0, 0); var de = neues Datum (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) return 0
Noor

3

Danke @ Vincent Robert , am Ende habe ich Ihr grundlegendes Beispiel verwendet, obwohl es tatsächlich so ist newBegin + oldEnd - oldBegin. Hier ist die vereinfachte Endlösung:

    // 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
Es ist ein guter Punkt zu erklären, warum Sie manchmal verwenden getTimeund manchmal nicht
Dan

2

Abhängig von Ihren Anforderungen berechnet diese Funktion die Differenz zwischen den beiden Tagen und gibt ein Ergebnis in Dezimalpunkten zurück.

// 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
Wenn Sie einen Math.abs()Anruf tätigen, erhalten Sie immer eine positive Dezimalstelle.
Koen.

1
Netter Vorschlag Koen. Das gibt den Menschen zwei Möglichkeiten: nur das wahre Datumsdifferenz, wie Sie es vorgeschlagen haben, oder ein Datumsschild mit dem Zeichen, das angibt, ob der Unterschied in der Vergangenheit oder in der Zukunft liegt. :)
Sparkyspider

Bitte beachten Sie, dass Sie in JavaScript auch eine Zahl in Millisekunden hinzufügen / entfernen können date.getTime(), um Zeit in Zukunft / Vergangenheit zu erhalten. `var nextMinute = neues Datum (someDate.getTime () + 60 * 1000);
Dan

Dies ist ein Tippfehler? "zwischen den 2 Tagen". Wahrscheinlich zwischen 2 Terminen.
Tomazahlin

2

Wenn Sie moment.js verwenden, gibt es eine einfachere Lösung, mit der Sie den Unterschied in Tagen in einer einzigen Codezeile feststellen können.

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

Weitere Details finden Sie auf der Seite moment.js

Prost, Miguel


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

1

erweiterter Code für alternative Änderungen.

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

Bitte fügen Sie Ihrer Antwort weitere Erläuterungen hinzu und verwenden Sie besseres Englisch.
Fund Monica Klage

Diese Lösung ist falsch, da Sie 365 Tage verwenden und Schaltjahre vernachlässigen.
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')
}

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>

0

Dieser Code füllt die Dauer der Studienjahre aus, wenn Sie das Start- und Enddatum (qualifiziertes akkreditiertes Datum) des Studiums eingeben und prüfen, ob die Dauer weniger als ein Jahr beträgt, wenn ja, die Warnung, dass eine Nachricht berücksichtigt wird, gibt es drei Eingabeelemente, das erste txtFromQualifDateund das erste zweite txtQualifDateund drittetxtStudyYears

es wird das Ergebnis der Anzahl der Jahre mit Bruch zeigen

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
Analysieren Sie niemals Datumszeichenfolgen, um das Jahr zu finden, da das Erscheinungsbild der Zeichenfolgen (insbesondere Trennzeichen) in den Browsern unterschiedlich ist. Verwenden Sie, getFullYeardie dafür konzipiert wurde. ------- Siehe datejs Bibliothek auf Google Code, die möglicherweise die meisten Eckfälle unterstützt
Dan

danke für den Rat @Dan, aber es hat für mich bei einem echten Regierungsprojekt (verschiedenen Browsern) funktioniert und getestet. Ist es so, dass schwache Programmierung praktiziert? :)
shareef

0

Wenn Sie Datumsobjekte verwenden und dann die getTime()Funktion für beide Datumsangaben verwenden, erhalten Sie die jeweiligen Zeiten seit dem 1. Januar 1970 in einem Zahlenwert. Sie können dann die Differenz zwischen diesen Zahlen erhalten.

Wenn Ihnen das nicht hilft, lesen Sie die vollständige Dokumentation: http://www.w3schools.com/jsref/jsref_obj_date.asp


Oh ja, habe es nicht bemerkt, die Antworten darunter sind höchstens ein halbes Jahr alt.
Koen.

0

Der folgende Code gibt die verbleibenden Tage von heute bis zum Futures-Datum zurück.

Abhängigkeiten: jQuery und 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');

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

0

DAS HABE ICH AN MEINEM SYSTEM GETAN.

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