Tage zwischen zwei Daten
Zählt die Tage zwischen zwei Terminen — zusätzlich in Wochen und in Jahren, Monaten und Tagen aufgeschlüsselt.
Wie lange ist das her? Wie viele Tage sind es noch? Diese Rechnung im Kopf zu machen, scheitert regelmäßig an den unterschiedlich langen Monaten und an den Schaltjahren. Das Script nimmt euch beides ab: Ihr wählt zwei Daten, und es nennt den Abstand in Tagen, in Wochen mit Resttagen und schließlich in Jahren, Monaten und Tagen.
Die drei Angaben beantworten verschiedene Fragen. Die reine Tageszahl ist die verlässlichste — sie ist eindeutig und eignet sich zum Weiterrechnen, etwa für Fristen. Die Aufschlüsselung in Jahre, Monate und Tage ist die, die man einem Menschen nennt: „zwei Jahre, drei Monate und elf Tage" versteht jeder sofort, während „843 Tage" niemandem etwas sagt.
Bei der Aufschlüsselung gibt es allerdings eine Feinheit, über die selbst Fachleute streiten. Wie viele Monate liegen zwischen dem 31. Januar und dem 28. Februar? Das Script rechnet kaufmännisch: Es zählt volle Monate und nimmt für den Rest die tatsächlichen Tage — vom 31. Januar bis zum 28. Februar ist demnach noch kein voller Monat vergangen, es sind 28 Tage. Für Fristen im rechtlichen Sinn gelten teils andere Regeln; im Zweifel zählt dort immer die Tagesangabe.
Verwandtes im Archiv: Altersberechnungen für den Sonderfall Geburtstag, Alter in Sekunden für die eindrucksvollere Zahl, Arbeitstage berechnen für Zeiträume ohne Wochenenden und An welchem Wochentag wurde ich geboren.
Der Starttag zählt nicht mit — vom 1. auf den 2. ist genau ein Tag.
So funktioniert das Script
Die Tageszahl ist schnell berechnet; die Aufschlüsselung in Jahre, Monate und Tage ist die eigentliche Aufgabe. Sie zeigt gut, warum Datumsrechnungen als fehleranfällig gelten.
const tage = Math.round((bis - von) / 86400000);
Zwei Date-Objekte lassen sich direkt voneinander abziehen — das Ergebnis ist der Abstand in Millisekunden, und 86400000 ist die Anzahl der Millisekunden eines Tages. Das Math.round ist eine Vorsichtsmaßnahme: Weil in UTC gerechnet wird, sollte die Division glatt aufgehen, aber Rundung schadet nie und fängt Zeitzonen-Überraschungen ab, falls jemand den Code später auf Ortszeit umstellt.
return new Date(Date.UTC(jahr, monat - 1, tag));
Zwei Fallen auf einmal. Erstens zählt JavaScript die Monate ab null — Januar ist 0, Dezember ist 11. Wer das vergisst, liegt konsequent einen Monat daneben. Zweitens wird in UTC gerechnet: Läge dazwischen eine Zeitumstellung, wäre ein Tag nur 23 oder 25 Stunden lang, und die Division ergäbe einen Tag zu viel oder zu wenig.
if (tage < 0) {
monate--;
const vormonat = new Date(Date.UTC(bis.getUTCFullYear(), bis.getUTCMonth(), 0));
tage += vormonat.getUTCDate();
}
Hier steckt der Kern der Aufschlüsselung. Zunächst werden Jahre, Monate und Tage einzeln voneinander abgezogen. Ist die Tagesdifferenz negativ — etwa vom 25. März bis zum 3. April, also 3 − 25 = −22 —, muss ein Monat „geliehen" werden. Nur: Wie viele Tage hat dieser Monat? Genau das beantwortet der Kniff mit der Null: Date.UTC(jahr, monat, 0) meint den nullten Tag des Monats, und den gibt es nicht — JavaScript rechnet daraus den letzten Tag des Vormonats. getUTCDate() darauf liefert dessen Länge, ganz ohne eine Tabelle mit „30 Tage hat September" und ohne Schaltjahr-Sonderfall.
if (monate < 0) {
jahre--;
monate += 12;
}
Dasselbe eine Ebene höher: Wurde bei den Monaten geliehen und rutschen sie dadurch ins Minus, wird ein Jahr aufgelöst. Die Reihenfolge ist zwingend — erst Tage, dann Monate, dann Jahre —, weil die Korrektur der Tage die Monatszahl noch verändern kann.
if (von > bis) {
const merker = von;
von = bis;
bis = merker;
}
Date-Objekte lassen sich mit den üblichen Vergleichsoperatoren ordnen. Statt bei verkehrter Eingabe eine Fehlermeldung auszugeben, tauscht das Script die beiden Werte und rechnet einfach — und sagt hinterher, dass es das getan hat. Nachsicht statt Belehrung ist bei Formularen fast immer die bessere Wahl.
Zum Anpassen: Sollen beide Endtage mitzählen, wie es bei Urlaubstagen üblich ist, addiert ihr am Ende eine 1 zur Tageszahl. Für den Abstand in Stunden oder Minuten teilt ihr statt durch 86400000 durch 3600000 beziehungsweise 60000 — dann solltet ihr allerdings auch eine Uhrzeit abfragen.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.
Mehr aus der Kategorie Datum & Uhrzeit
-
An welchem Wochentag wurde ich geboren?
-
Analoge Uhr
-
Analoge Uhr mit römischen Ziffern
-
Arbeitstage berechnen
-
Chinesisches Tierkreiszeichen
-
Digitaluhr
-
Jahreszeit
-
Kalender
-
Kalender mit Uhrzeit und Feiertagen
-
Kalenderwoche berechnen
-
Mondphase berechnen
-
Osterdatum berechnen
-
Schaltjahr prüfen
-
Sternzeichen ermitteln
-
Tage bis zum Jahr 3000
-
Uhrzeit in Worten
-
Unix-Zeitstempel wandeln
-
Weltzeituhr
-
Zeitumstellung