578 Stimmen

Wie berechnet man die Anzahl der Tage zwischen zwei Daten?

Ein Beispiel: Zwei Daten in Eingabefeldern:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

Wie ermittle ich die Anzahl der Tage zwischen zwei Daten in JavaScript?

20 Stimmen

In 99 % der Fälle, in denen der Benutzer nach der "Anzahl der Tage zwischen zwei Daten" fragt, versteht er nicht, dass er versucht, Äpfel mit Birnen zu vergleichen. Das Problem wird so einfach, wenn man fragt: "Wie viele DATEN liegen in einem DATUMSBEREICH?", oder wie viele Quadrate ich auf dem Kalender ankreuzen muss. Die Verwirrung wird uns durch die datetime-Datenstruktur auferlegt, die reiner Unfug ist. Es gibt so etwas wie datetime nicht, es gibt Datum und es gibt Zeit, zwei sehr unterschiedliche Objekte sowohl in der Natur als auch im Verhalten.

0 Stimmen

Für eine Funktion, die die Differenz in (ganze) Zeiteinheiten aufteilt, verwenden Sie die Antwort unter stackoverflow.com/a/53092438/3787376 .

1 Stimmen

Meiner Meinung nach sollte diese Frage gestrichen oder zumindest mit "vermeiden" gekennzeichnet werden, da die meisten Antworten entweder falsch oder von verschiedenen Bibliotheken abhängig sind.

4voto

Sriman Pathy Punkte 149

Die einfache Art, die Tage zwischen zwei Daten zu berechnen, besteht darin, ihre beiden Zeitkomponenten zu entfernen, d. h. Stunden, Minuten, Sekunden und Millisekunden auf 0 zu setzen und dann ihre Zeit zu subtrahieren und sie mit Millisekunden im Wert eines Tages zu tauchen.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

0 Stimmen

Das Problem bei Ihrer Lösung ist, dass Sie davon ausgehen, dass firstDate und secondDate Datumsangaben sind, die dann nicht mehr in Datumsangaben geändert werden müssen, und wenn sie keine Datumsangaben sind (was nicht der Fall ist), erhalten Sie einen Fehler bei setHours. Um dies zu korrigieren, müssen Sie setHours aus der new Date

4voto

Dalibor Matura Punkte 41

Seien Sie vorsichtig, wenn unter Verwendung von Millisekunden .

El date.getTime() gibt Millisekunden zurück und macht Eine mathematische Operation mit Millisekunden erfordert die Einbeziehung

  • Sommerzeit (DST)
  • Prüfung, ob beide Daten die gleiche Zeit haben (Stunden, Minuten, Sekunden, Millisekunden)
  • Vergewissern Sie sich, welches Verhalten von days diff erforderlich ist: 19. September 2016 - 29. September 2016 = 1 oder 2 Tage Unterschied?

Das Beispiel aus dem obigen Kommentar ist die beste Lösung, die ich bisher gefunden habe https://stackoverflow.com/a/11252167/2091095 . Aber verwenden +1 zu seinem Ergebnis hinzufügen, wenn Sie möchten, dass der alle beteiligten Tage zählt.

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;

4voto

user3806549 Punkte 1328

Ich hatte das gleiche Problem in Angular. Ich mache die Kopie, weil er sonst das erste Datum überschreiben wird. Beide Daten müssen die Zeit 00:00:00 haben (offensichtlich)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

4voto

Wallace Sidhrée Punkte 10197

Wenn Sie zwei Unix-Zeitstempel haben, können Sie diese Funktion verwenden (der Übersichtlichkeit halber etwas ausführlicher gestaltet):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Ejemplo:

daysBetween(1096580303, 1308713220); // 2455

3voto

Ricardo Fercher Punkte 677

Wenn Sie ein DateArray mit Daten haben wollen, versuchen Sie dies:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X