Tage bis Ostern
Zählt sekundengenau bis zum nächsten Ostersonntag und nennt die davon abhängigen Feiertage bis Fronleichnam.
Ostern ist das einzige große Fest, dessen Datum jedes Jahr an anderer Stelle im Kalender steht — zwischen dem 22. März und dem 25. April, also über einen Zeitraum von fünf Wochen. Dieser Zähler sagt euch, wie lange es noch dauert, und zwar sekundengenau.
Die Regel dahinter beschloss das Konzil von Nicäa im Jahr 325: Ostern ist der erste Sonntag nach dem ersten Vollmond im Frühling. Damit hängt das Fest an drei Dingen zugleich — am Frühlingsanfang, am Mondlauf und am Wochenrhythmus. Weil sich diese drei nicht ineinander aufgehen lassen, springt das Datum. Die Kirche rechnet dabei nicht mit dem tatsächlichen Mond, sondern mit einem festgelegten Zyklus, der ihm sehr nahe kommt — sonst hinge der Termin von Beobachtungen und damit vom Wetter ab.
Am Osterdatum hängt fast der halbe Festkalender: Karfreitag zwei Tage davor, Ostermontag einen danach, Christi Himmelfahrt 39 Tage danach, Pfingsten 49 und 50 Tage danach, Fronleichnam 60 Tage danach. Auch rückwärts geht es weiter — Rosenmontag liegt 48 Tage vor Ostern, Aschermittwoch 46. Das Script rechnet all diese Termine mit aus und zeigt sie unter dem Zähler.
Verwandtes im Archiv: Osterdatum berechnen geht auf die Formel selbst ein, Arbeitstage berechnen nutzt sie für die Feiertagsliste, und in dieser Abteilung zählen Tage bis Weihnachten und Countdown bis Silvester zu den festen Terminen.
So funktioniert das Script
Das Script besteht aus drei Teilen: der Osterformel, der Suche nach dem nächsten Ostern und dem laufenden Countdown. Der mittlere Teil ist kürzer, als man denkt, und der dritte zeigt eine Rechnung, die man ständig braucht.
let ziel = ostersonntag(jetzt.getFullYear());
if (ziel < jetzt) ziel = ostersonntag(jetzt.getFullYear() + 1);
Ein Countdown auf ein jährliches Ereignis braucht immer diese zwei Zeilen: Erst wird der Termin im laufenden Jahr berechnet; liegt er schon in der Vergangenheit, nimmt man den des nächsten Jahres. Bei Weihnachten ginge das mit einem festen Datum, bei Ostern muss die Formel zweimal laufen — was nichts kostet, weil sie aus einer Handvoll Rechenschritten besteht.
const sekunden = Math.floor(rest / 1000);
const tage = Math.floor(sekunden / 86400);
const stunden = Math.floor((sekunden % 86400) / 3600);
const minuten = Math.floor((sekunden % 3600) / 60);
const rest_sekunden = sekunden % 60;
Das ist das Grundmuster jedes Countdowns: Aus einem Abstand in Millisekunden werden Tage, Stunden, Minuten und Sekunden. Der Kniff steckt im Wechselspiel von Division und Restbildung. Die Division sagt, wie viele volle Einheiten hineinpassen; der Rest liefert das, was für die nächstkleinere Einheit übrig bleibt. sekunden % 86400 heißt „die Sekunden, die nach Abzug aller vollen Tage bleiben", und daraus ergeben sich die Stunden. Wer den Rest vergisst, bekommt bei den Stunden die Gesamtzahl der Stunden seit heute — ein Fehler, der bei kurzen Zeiträumen unauffällig bleibt.
return new Date(jahr, monat - 1, tag, 0, 0, 0);
Anders als beim Arbeitstage-Rechner wird hier bewusst in Ortszeit gerechnet und nicht in UTC. Der Grund: Der Countdown soll um Mitternacht vor Ort auf null gehen, nicht um Mitternacht in Greenwich. Beim Zählen von Tagen ist UTC richtig, beim Herunterzählen auf einen lokalen Termin die Ortszeit — dieselbe Unterscheidung führt in vielen Programmen zu Fehlern, die genau eine Stunde betragen.
return termine.map(function (eintrag) {
return eintrag.name.padEnd(20, " ") + alsText(verschoben(ostern, eintrag.tage));
}).join("\n");
Die Terminliste ist eine Tabelle aus Namen und Tagesabständen zu Ostern; map macht daraus die fertigen Zeilen. padEnd füllt den Namen mit Leerzeichen auf zwanzig Zeichen auf, damit die Datumsangaben untereinanderstehen. Negative Abstände sind dabei kein Sonderfall — setDate mit einem negativen Wert geht einfach in den Vormonat zurück.
setInterval(ticken, 1000);
Der Takt von einer Sekunde ist bei einem Countdown über Monate großzügig bemessen — genau genommen laufen die meisten Aktualisierungen ins Leere, weil sich nur die Sekundenziffer ändert. Das ist so wenig Aufwand, dass es nicht ins Gewicht fällt. Bei einer aufwendigeren Anzeige würde man den Takt bei großen Abständen auf eine Minute strecken.
Zum Anpassen: Für den orthodoxen Ostertermin gilt eine andere Formel, die den julianischen Kalender zugrunde legt — das Datum liegt meist eine bis fünf Wochen später. Wollt ihr den Countdown auf einen anderen beweglichen Termin richten, ersetzt ihr nur die Funktion, die das Zieldatum liefert; der Rest bleibt unverändert.
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.