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.

1voto

lewdev Punkte 6158

Ich habe mich von anderen Antworten inspirieren lassen und dafür gesorgt, dass die Eingänge automatisch saniert werden. Ich hoffe, dass dies eine gute Verbesserung gegenüber anderen Antworten darstellt.

//use best practices by labeling your constants.
let MS_PER_SEC = 1000
  , SEC_PER_HR = 60 * 60
  , HR_PER_DAY = 24
  , MS_PER_DAY = MS_PER_SEC * SEC_PER_HR * HR_PER_DAY
;

//let's assume we get Date objects as arguments, otherwise return 0.
function dateDiffInDays(date1, date2) {
    if (!date1 || !date2) {
      return 0;
    }
    return Math.round((date2.getTime() - date1.getTime()) / MS_PER_DAY);
}

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format. (by @Miles)
function parseDate(str) {
    if (str && str.length > 7 && str.length < 11) {
      let mdy = str.split('/');
      return new Date(mdy[2], mdy[0]-1, mdy[1]);
    }
    return null;
}

function calcInputs() {
  let date1 = document.getElementById("date1")
    , date2 = document.getElementById("date2")
    , resultSpan = document.getElementById("result")
  ;
  if (date1 && date2 && resultSpan) {
    //remove non-date characters
    let date1Val = date1.value.replace(/[^\d\/]/g,'')
      , date2Val = date2.value.replace(/[^\d\/]/g,'')
      , result = dateDiffInDays(parseDate(date1Val), parseDate(date2Val))
    ;
    date1.value = date1Val;
    date2.value = date2Val;
    resultSpan.innerHTML = result + " days";
  }
}
window.onload = function() { calcInputs(); };

//some code examples
console.log(dateDiffInDays(parseDate("1/15/2019"), parseDate("1/30/2019")));
console.log(dateDiffInDays(parseDate("1/15/2019"), parseDate("2/30/2019")));
console.log(dateDiffInDays(parseDate("1/15/2000"), parseDate("1/15/2019")));

<input id="date1" type="text" value="1/1/2000" size="6" onkeyup="calcInputs();" />
<input id="date2" type="text" value="1/1/2019" size="6" onkeyup="calcInputs();"/>
Result: <span id="result"></span>

2 Stimmen

Anstelle von 'date1.getTime()' und 'date2.getTime()' verwende ich 'Date.UTC', um zu verhindern, dass sich Daten unterscheiden, die nicht zur gleichen Sommerzeit gehören (z.B. 10. März 2021 und 16. März 2021), kann die folgende Funktion helfen: function getUTCTime(date) { // If use 'Date.getTime()' it doesn't compute the right amount of days // if there is a 'day saving time' change between dates return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()); }

0voto

Sumit Ridhal Punkte 1281

Sie können UnderscoreJS für die Formatierung und Berechnung der Differenz verwenden.

Demo https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));

body { white-space: pre; font-family: monospace; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

0voto

Umang Loriya Punkte 751

Die Verwendung von Moment wird in diesem Fall viel einfacher sein, Sie könnten dies versuchen:

    let days = moment(yourFirstDateString).diff(moment(yourSecondDateString), 'days');

Sie erhalten einen ganzzahligen Wert wie 1, 2, 5, 0 usw., so dass Sie leicht eine Bedingungsprüfung wie verwenden können:

if(days < 1) {

Außerdem können Sie ein genaueres Ergebnis der Zeitdifferenz (in Dezimalzahlen wie 1.2, 1.5, 0.7 usw.) erhalten, wenn Sie diese Art von Ergebnis mit dieser Syntax erhalten:

let days = moment(yourFirstDateString).diff(moment(yourSecondDateString), 'days', true);

Lassen Sie mich wissen, wenn Sie weitere Fragen haben

-1voto

Edward Punkte 994

In dieser Antwort, die auf einer anderen Antwort beruht (Link am Ende), geht es um den Unterschied zwischen zwei Daten.
Sie können sehen, wie es funktioniert, weil es einfach ist, außerdem beinhaltet es die Aufteilung der Differenz in
Zeiteinheiten (eine Funktion, die ich erstellt habe) und Konvertierung in UTC, um Probleme mit Zeitzonen zu vermeiden.

function date_units_diff(a, b, unit_amounts) {
    var split_to_whole_units = function (milliseconds, unit_amounts) {
        // unit_amounts = list/array of amounts of milliseconds in a
        // second, seconds in a minute, etc., for example "[1000, 60]".
        time_data = [milliseconds];
        for (i = 0; i < unit_amounts.length; i++) {
            time_data.push(parseInt(time_data[i] / unit_amounts[i]));
            time_data[i] = time_data[i] % unit_amounts[i];
        }; return time_data.reverse();
    }; if (unit_amounts == undefined) {
        unit_amounts = [1000, 60, 60, 24];
    };
    var utc_a = new Date(a.toUTCString());
    var utc_b = new Date(b.toUTCString());
    var diff = (utc_b - utc_a);
    return split_to_whole_units(diff, unit_amounts);
}

// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
   /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

So funktioniert mein obiger Code

Eine Datums-/Zeitdifferenz in Millisekunden kann mit der Funktion Datum Objekt:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.

var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.

Um dann die Anzahl der Sekunden in dieser Differenz zu berechnen, teilen Sie sie durch 1000, um umzurechnen
Millisekunden in Sekunden ändern, dann das Ergebnis in eine ganze Zahl ändern, um die
die Millisekunden (Bruchteil dieser Dezimalzahl): var seconds = parseInt(diff/1000) .
Außerdem könnte ich mit demselben Verfahren zum Beispiel längere Zeiteinheiten erhalten:
- (ganz) Minuten dividiert Sekunden durch 60 und ändert das Ergebnis in eine ganze Zahl,
- Stunden dividiert Minuten durch 60 und ändert das Ergebnis in eine ganze Zahl.

Ich habe eine Funktion erstellt, die diesen Prozess der Aufteilung der Differenz in
ganze Zeiteinheiten, genannt split_to_whole_units mit dieser Demo:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

Diese Antwort stützt sich auf diese andere .

-1voto

drzaus Punkte 22843

Bookmarklet-Version der anderen Antworten, die Sie zur Eingabe beider Daten auffordert:

javascript:(function() {
    var d = new Date(prompt("First Date or leave blank for today?") || Date.now());
    prompt("Days Between", Math.round(
        Math.abs(
            (d.getTime() - new Date(prompt("Date 2")).getTime())
                /(24*60*60*1000)
             )
        ));
})();

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