JavaScriptsDatum & Uhrzeit

An welchem Wochentag wurde ich geboren?

Verrät euch zu einem beliebigen Geburtsdatum, auf welchen Wochentag es fiel — berechnet mit reiner Kalender-Arithmetik.

Wisst ihr, an welchem Wochentag ihr geboren wurdet? Die wenigsten haben das im Kopf — dieses Script verrät es euch in Sekundenschnelle. Ihr tragt Tag, Monat und Jahr eures Geburtstags in die drei Felder ein, klickt auf „Wochentag ausgeben", und schon steht das Ergebnis darunter.

Als Beispiel ist der 8. Mai 1960 vorausgefüllt — das war übrigens ein Sonntag. Tauscht die Werte einfach gegen euer eigenes Geburtsdatum aus. Das Script funktioniert natürlich nicht nur für Geburtstage: Auch für Hochzeitstage, historische Ereignisse oder Termine in der Zukunft liefert es den Wochentag.

Das Interessante an diesem Klassiker: Er benutzt kein fertiges Datums-Objekt, sondern rechnet den Wochentag selbst aus — mit einer Formel aus der Kalender-Arithmetik, die auf die sogenannte Zellersche Kongruenz zurückgeht. Sie nutzt aus, dass sich die Wochentage in einem festen Rhythmus wiederholen und Schaltjahre nach klaren Regeln eingeschoben werden. Gültig ist die Rechnung für den gregorianischen Kalender, also für Jahre ab 1583.

Wer noch mehr Kalender-Rechnerei mag: Das Script Osterdatum berechnen bestimmt mit einer ähnlichen Formel das Osterdatum eines Jahres, und unser Kalender zeigt euch den aktuellen Monat im Überblick.

Datum & Uhrzeit Baujahr 2004 läuft in deinem Browser

So funktioniert das Script

Das Script besteht aus drei Teilen: Es liest die drei Eingabefelder aus und prüft sie, rechnet dann mit einer Wochentagsformel und schreibt das Ergebnis in die Ausgabefläche. Zwei Arrays halten die deutschen Namen der Wochentage und Monate bereit. Alles steckt in einer sofort ausgeführten Funktion, damit keine Variablennamen mit anderen Scripts auf der Seite kollidieren.

const tage = ["Samstag", "Sonntag", "Montag", "Dienstag",
  "Mittwoch", "Donnerstag", "Freitag"];

Ein Array (eine nummerierte Liste) mit den Wochentagsnamen. Die Reihenfolge sieht seltsam aus — sie beginnt mit Samstag —, ist aber kein Fehler: Die Formel unten liefert als Ergebnis eine Zahl von 0 bis 6, und bei ihr steht die 0 nun einmal für den Samstag. Das Monats-Array darunter beginnt mit einem leeren Eintrag, damit monate[1] wie erwartet den Januar liefert und nicht der Index verschoben werden muss. Das Original baute sich diese Listen noch umständlich mit einer eigenen MakeArray-Hilfsfunktion — heute schreibt man Arrays einfach in eckigen Klammern hin.

if (isNaN(tag) || isNaN(monat) || isNaN(jahrEingabe)) {
  ausgabe.textContent = "Bitte füllt alle drei Felder aus.";
  return;
}

Vor dem Rechnen werden die Eingaben geprüft. parseInt(…, 10) hat die Feldinhalte zuvor in ganze Zahlen verwandelt; bei leerem oder unlesbarem Inhalt kommt dabei NaN („Not a Number") heraus, das isNaN() erkennt. Danach folgen die Bereichsprüfungen für Tag, Monat und Jahr — jeweils mit einer freundlichen Meldung in der Ergebnisfläche und einem return, das die Funktion beendet. Das Original zeigte hier alert()-Fenster an, rechnete aber trotzdem munter weiter; die Jahresgrenze 1583 ergibt sich daraus, dass die Formel nur für den gregorianischen Kalender gilt.

// Januar und Februar zählen als Monat 13 und 14 des Vorjahres
let m = monat;
let jahr = jahrEingabe;
if (m === 1) { m = 13; jahr = jahr - 1; }
if (m === 2) { m = 14; jahr = jahr - 1; }

Hier kommt der zentrale Kniff der Zellerschen Kongruenz: Januar und Februar werden als 13. und 14. Monat des Vorjahres behandelt. Warum? Der Schalttag liegt Ende Februar — hängt man die beiden Monate ans Vorjahr an, endet das „Rechenjahr" genau vor dem möglichen Schalttag, und die Schaltjahresregeln lassen sich viel einfacher anwenden. Die Originaleingaben bleiben in monat und jahrEingabe erhalten, damit die Ausgabe später das echte Datum nennt.

const monatsanteil = Math.floor(((m + 1) * 3) / 5);
const schalt4 = Math.floor(jahr / 4);
const schalt100 = Math.floor(jahr / 100);
const schalt400 = Math.floor(jahr / 400);
const summe = tag + m * 2 + monatsanteil + jahr + schalt4 - schalt100 + schalt400 + 2;

Das ist die eigentliche Formel. Math.floor() rundet ab (das Original nutzte dafür zweckentfremdet parseInt). Der monatsanteil gleicht aus, dass die Monate mal 30, mal 31 Tage haben. Die drei schalt…-Werte zählen die Schaltjahre: alle 4 Jahre eines dazu, alle 100 Jahre fällt eines aus, alle 400 Jahre gibt es doch eines — genau die Schaltjahresregel des gregorianischen Kalenders. Zusammen mit Tag, Monatsbeitrag und Jahreszahl ergibt das eine große Summe, die für jeden Kalendertag um genau 1 wächst.

const rest = summe % 7;

ausgabe.innerHTML = "Der " + tag + ". " + monate[monat] + " " + jahrEingabe +
  " war ein <strong>" + tage[rest] + "</strong>.";

Weil sich die Wochentage alle sieben Tage wiederholen, interessiert von der großen Summe nur der Rest beim Teilen durch 7 — genau das liefert der Prozent-Operator %. Das Ergebnis ist eine Zahl von 0 bis 6, mit der aus dem tage-Array der passende Name geholt wird. Die Ausgabe wird per innerHTML gesetzt, damit der Wochentag in <strong>-Tags hervorgehoben erscheint. Das Original schrieb das Ergebnis noch in zwei schreibgeschützte Formularfelder.

document.getElementById("wt-berechnen").addEventListener("click", berechnen);

Zum Schluss wird die Funktion berechnen() mit dem Knopf verbunden. Das Script steht dafür unter dem Formular — so existieren die Felder und der Knopf bereits, wenn es ausgeführt wird.

Zum Anpassen: Die Ausgabesprache ändert ihr einfach über die beiden Arrays am Anfang und den Satz in der ausgabe.innerHTML-Zeile. Eine kleine Grenze hat das Script geerbt: Unmögliche Daten wie den 31. Februar erkennt es nicht, sondern rechnet stumpf weiter — wer das abfangen will, kann die Eingabe zusätzlich mit einem Date-Objekt gegenprüfen.

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