JavaScriptsZähler

Tage bis Weihnachten

Schreibt beim Seitenaufruf einen Satz auf die Seite, wie viele Tage es noch bis zum Weihnachtsfeiertag sind.

Wie lange muss man noch aufs Christkind warten? Dieses Script verrät es in einem einzigen Satz. Es rechnet beim Aufruf der Seite aus, wie viele Tage noch bis zum 25. Dezember des laufenden Jahres vergehen, und schreibt das Ergebnis in ganzen Worten hin — ohne Knopf, ohne Formular, ohne Einstellungen.

Das Jahr setzt sich dabei von selbst: Das Script fragt schlicht die Uhr des Besuchers nach dem aktuellen Jahr und nimmt dessen 25. Dezember als Ziel. Ihr baut es also einmal ein und müsst nie wieder etwas daran ändern. Weil hier oben schon der Satz für heute steht, seht ihr sofort, was eure Besucher zu sehen bekommen.

Ein paar Tage im Jahr fällt der Satz anders aus, und das ist Absicht: Am 23. Dezember heißt es „Morgen ist Heiligabend!", am 24. „Heute ist Heiligabend!" und am 25. „Heute ist der erste Weihnachtsfeiertag!". In der Woche danach zählt das Script rückwärts weiter und meldet, wie lange der Feiertag schon her ist — bis zum Jahreswechsel, an dem es wieder von vorn beginnt. Zur Einordnung: Der 24. Dezember ist in Deutschland kein gesetzlicher Feiertag, gesetzliche Feiertage sind der 25. und der 26. Dezember, also der erste und der zweite Weihnachtsfeiertag.

Anders als bei einem echten Countdown wird hier nur einmal beim Laden gerechnet. Wer die Zeit lieber sekundengenau und fortlaufend heruntergezählt sehen will, nimmt unseren Countdown bis Weihnachten. Für einen beliebigen anderen Termin gibt es den frei einstellbaren Countdown, für das andere große Datum am Jahresende den Silvester-Countdown. Nach demselben Muster wie hier arbeitet auch das Script Tage bis zum Monatsende. Und wer das bewegliche Gegenstück zu Weihnachten sucht: Das Osterdatum lässt sich bei uns ebenfalls berechnen.

Zähler Baujahr 2004 läuft in deinem Browser

Der Satz wird beim Laden der Seite aus dem aktuellen Datum eures Rechners errechnet.

So funktioniert das Script

Das Script läuft genau einmal ab, wenn die Seite geladen wird, und erledigt dabei drei Schritte: Es baut sich das Zieldatum, es rechnet den Abstand in Tage um, und es sucht in einer Kette von Bedingungen den passenden Satz dazu heraus. Alles steckt in einer sofort ausgeführten Funktion, damit die Variablennamen nicht mit anderen Scripts auf der Seite kollidieren.

const heute = new Date();
const jahr = heute.getFullYear();
const weihnachten = new Date(jahr, 11, 25); // 11 = Dezember

new Date() ohne Angaben liefert den aktuellen Zeitpunkt mit Datum und Uhrzeit. getFullYear() holt daraus die vierstellige Jahreszahl. Damit wird das Zieldatum gebaut — und hier ist die berüchtigte Stolperfalle: JavaScript zählt Monate ab 0, Dezember ist also die 11. Das Originalscript umging das mit dem englischen Text "December 25, " + jahr; darauf sollte man sich nicht verlassen, weil das Einlesen von Datumstexten je nach Browser unterschiedlich ausfällt. Die Zahlenschreibweise ist eindeutig. Nebenbei ist auch das alte getYear() verschwunden, das je nach Browser mal 2026 und mal 126 lieferte und deshalb im Original umständlich korrigiert werden musste.

const differenz = weihnachten.getTime() - heute.getTime();
const tage = Math.floor(differenz / (1000 * 60 * 60 * 24));

getTime() gibt einen Zeitpunkt als reine Zahl aus: die Millisekunden seit dem 1. Januar 1970, dem sogenannten Nullpunkt der Computerzeitrechnung. Zwei solche Zahlen lassen sich einfach voneinander abziehen. Geteilt wird anschließend durch die Millisekunden eines Tages, also 1000 * 60 * 60 * 24 — man hätte auch 86400000 hinschreiben können, aber so ist auf einen Blick zu sehen, wie die Zahl zustande kommt. Math.floor rundet ab.

Wichtig für das Verständnis der folgenden Sätze: Verglichen wird der aktuelle Zeitpunkt mit Uhrzeit gegen den 25. Dezember um Mitternacht. Am 24. Dezember liegt also weniger als ein voller Tag dazwischen, tage ist dann 0. Am 23. Dezember ist es eine 1, am 25. Dezember eine −1.

if (tage > 1) {
  text = "Es sind noch " + (tage + 1) + " Tage bis zum Weihnachtsfeiertag!";
} else if (tage === 1) {
  text = "Morgen ist Heiligabend!";
} else if (tage === 0) {
  text = "Heute ist Heiligabend!";
}

Eine if-else if-Kette arbeitet die Fälle von oben nach unten ab und hört beim ersten Treffer auf. Das + 1 im ersten Satz gleicht die abgeschnittenen Stunden wieder aus: Am 22. Dezember ist tage gleich 2, gemeint sind aber die drei Tage bis zum 25. Die drei Gleichheitszeichen prüfen streng auf Wert und Typ; in JavaScript ist das dem einfachen == immer vorzuziehen.

text = "Der erste Weihnachtsfeiertag war vor " + ((tage + 1) * -1) +
  (tage < -2 ? " Tagen" : " Tag") + " in diesem Jahr!";

Nach dem Fest wird tage negativ, deshalb dreht * -1 das Vorzeichen wieder um. Der letzte Baustein löst das Sprachproblem: Das Fragezeichen-Doppelpunkt-Konstrukt ist eine Kurzschreibweise für „wenn … dann … sonst …" und wählt zwischen „Tag" und „Tagen" — so entsteht kein „vor 1 Tagen".

ausgabe.textContent = text;

Am Ende landet der fertige Satz per textContent in der Ausgabefläche. Das Original schrieb ihn noch mit document.write() direkt in den Seitenfluss — das funktioniert nur, solange die Seite gerade aufgebaut wird, und würde bei einem später nachgeladenen Script die komplette Seite überschreiben. Der Umweg über ein vorhandenes Element ist deshalb die sichere Variante.

Zum Anpassen: Das Script lässt sich mit zwei Handgriffen auf jeden anderen festen Jahrestag umstellen — ändert im new Date(jahr, 11, 25) Monat und Tag, etwa auf new Date(jahr, 9, 3) für den 3. Oktober, und formuliert die Sätze in der if-Kette entsprechend um. Wer nur den nüchternen Satz braucht, kann die Sonderfälle für den 23. bis 26. Dezember auch ersatzlos streichen.

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 Zähler