871 Stimmen

Unterschied zwischen 2 Daten in JavaScript ermitteln?

Wie ermittle ich die Differenz zwischen 2 Daten in ganzen Tagen (ich möchte keine Tagesbruchteile)?

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

Ich habe das oben beschriebene versucht, aber es hat nicht funktioniert.

49 Stimmen

Nur eine Randbemerkung: Erstellen Sie keine Date-Objekte mit dieser Art von Strings als Eingabe; es ist nicht standardisiert und hängt vom Browser ab, wie diese geparst werden. Verwenden Sie Strings, die geparst werden können von Datum.parsen oder besser gesagt, verwenden Sie drei numerische Werte als Argumente für new Date z.B. new Date(2010, 11, 7); .

4 Stimmen

Nebenbemerkung: Vertrauen Sie niemals der Systemzeit auf der Client-Seite! Sie ist oft falsch, und Sie könnten Ihre Anwendung zerstören.

0 Stimmen

Versuchen Sie auch eine kleine Funktion unter stackoverflow.com/a/53092438/3787376 .

1303voto

TNi Punkte 14868

Hier ist eine Möglichkeit :

const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2 - date1);
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffTime + " milliseconds");
console.log(diffDays + " days");

Beachten Sie, dass wir das Datum in Anführungszeichen setzen müssen. Der Rest des Codes ermittelt die Zeitdifferenz in Millisekunden und teilt sie dann, um die Anzahl der Tage zu erhalten. Datum erwartet das Format mm/dd/yyyy.

0 Stimmen

Ah, die Anführungszeichen waren ein Tippfehler. Dennoch bekomme ich wie 1 Tag mit meinem Weg.

0 Stimmen

Was ist (1000 * 3600 * 24), was ist jedes davon (Minuten? Sekunden? Stunden?)

0 Stimmen

Ein weiteres Problem, das Sie haben und das @volkan er nicht zu haben scheint, ist, dass, wenn date2 kleiner als date 1 ist, Ihre eine positive Zahl anstelle einer negativen Zahl ausgibt.

1031voto

Shyam Habarakada Punkte 14267

Eine korrektere Lösung

... da die Daten natürlich Zeitzoneninformationen enthalten, die sich auf Regionen mit unterschiedlichen Sommerzeitregelungen erstrecken können

Die bisherigen Antworten auf diese Frage berücksichtigen nicht die Fälle, in denen die beiden fraglichen Daten eine Sommerzeitumstellung umfassen. Das Datum, an dem die Sommerzeitumstellung stattfindet, hat eine Dauer in Millisekunden, die != 1000*60*60*24 so dass die typische Berechnung fehlschlägt.

Sie können dieses Problem umgehen, indem Sie die beiden Daten zunächst auf UTC normalisieren und dann die Differenz zwischen diesen beiden UTC-Daten berechnen.

Die Lösung kann nun wie folgt geschrieben werden,

const _MS_PER_DAY = 1000 * 60 * 60 * 24;

// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  // Discard the time and time-zone information.
  const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());

  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

// test it
const a = new Date("2017-01-01"),
    b = new Date("2017-07-25"),
    difference = dateDiffInDays(a, b);

Dies funktioniert, weil die UTC-Zeit nie die Sommerzeit einhält. Siehe Wird in UTC die Sommerzeit eingehalten?

p.s. Nach der Diskussion einige der Kommentare zu dieser Antwort, sobald Sie die Probleme mit Javascript Daten, die eine DST-Grenze überspannen verstanden haben, gibt es wahrscheinlich mehr als nur eine Möglichkeit, es zu lösen. Was ich oben zur Verfügung gestellt ist eine einfache (und getestet) Lösung. Ich würde daran interessiert sein, zu wissen, ob es eine einfache arithmetische/math-basierte Lösung, anstatt die zwei neuen Date-Objekte zu instanziieren ist. Das könnte möglicherweise schneller sein.

70 Stimmen

Dies ist die EINZIGE richtige Antwort, ich verstehe nicht, warum andere Antworten akzeptiert werden

29 Stimmen

Wahrscheinlich, weil @chobo2 nicht zurückgekommen ist und sich diese Frage angesehen hat

6 Stimmen

@Ai_boy: Dies ist zwar die logisch korrekteste Antwort, aber es gibt keine Werte, für die sie nicht mit der einfacheren Math.round((b - a)/ _MS_PER_DAY, 0) Daher ist es schwierig, "die einzig richtige Antwort" zu unterstützen.

136voto

Matt Johnson-Pint Punkte 212496

Hier ist eine Lösung mit moment.js :

var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);

Ich habe Ihre ursprünglichen Eingabewerte verwendet, aber Sie haben das Format nicht angegeben, also habe ich angenommen, dass der erste Wert der 11. Juli ist. Wenn es der 7. November sein sollte, dann ändern Sie das Format auf D/M/YYYY stattdessen.

7 Stimmen

Danke, ich war auf der Suche nach einer momentjs-Lösung

0 Stimmen

@Matt Johnson: Ich möchte die genaue Differenz, d. h. die Anzahl der Tage, Stunden, Minuten und Sekunden, die von diesem Zeitpunkt bis zu einem zukünftigen Datum verbleiben, ermitteln. Wie kann man das machen?

1 Stimmen

59voto

volkan er Punkte 936
var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24), 10); 

alert(diffDays )

1 Stimmen

Date2 - date1 => Ausgabe von Millisekunden (1000 * 60 * 60 * 24) => Millisekunde bis Tag

11 Stimmen

Ist parseInt nicht völlig unnötig?

0 Stimmen

Um den vollen Wert in Bezug auf die Anzahl der Tage zu erhalten; Antrag und wird arbeitsbedingt sein...

13voto

Mikeys4u Punkte 1350

Ich habe viele Möglichkeiten ausprobiert und festgestellt, dass die Verwendung von Datepicker die beste ist, aber das Datumsformat verursacht Probleme mit JavaScript....

Hier ist also meine Antwort, und sie kann sofort ausgeführt werden.

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">

<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {

$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})

$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });

$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');

if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

eine Fiddle ist hier zu sehen DEMO

0 Stimmen

Dies ist ein ähnliches Problem zu dem, was ich habe das Problem mit dieser Lösung ist, dass, wenn der Benutzer auf das Datum2 Datepicker zuerst klickt, dann es fehlschlägt.

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