JavaScriptsDatum & Uhrzeit

Arbeitstage berechnen

Zählt die Arbeitstage zwischen zwei Terminen — ohne Wochenenden und ohne die gesetzlichen Feiertage des gewählten Bundeslandes.

Wie viele Arbeitstage liegen zwischen zwei Terminen? Die Frage stellt sich bei Lieferfristen, Urlaubsplanung und Projektzeiten — und die Antwort hängt davon ab, wo man wohnt. Deutschland hat neun bundesweite Feiertage und dazu ein gutes Dutzend, die nur in bestimmten Ländern gelten. Bayern kommt auf dreizehn, Berlin und die meisten norddeutschen Länder auf zehn oder elf.

Wählt Zeitraum und Bundesland, und das Script zählt: Gesamttage, davon Samstage und Sonntage, davon Feiertage an Werktagen — und was als Arbeitstage übrig bleibt. Alle Feiertage des Zeitraums werden namentlich aufgeführt, samt Hinweis, wenn einer auf ein Wochenende fällt und damit ohnehin keinen Arbeitstag kostet.

Der aufwendigste Teil sind die beweglichen Feiertage. Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag und Fronleichnam hängen alle am Osterdatum und wandern mit ihm durch den Kalender. Das Script berechnet Ostern nach der Gaußschen Osterformel und leitet die übrigen daraus ab. Ein weiterer Sonderfall ist der Buß- und Bettag, der nur noch in Sachsen gesetzlicher Feiertag ist und immer auf den Mittwoch vor dem 23. November fällt.

Ein Hinweis ohne Gewähr: Einige Feiertage gelten nur in Teilen eines Landes — Fronleichnam etwa in einzelnen Gemeinden Sachsens und Thüringens, Mariä Himmelfahrt in überwiegend katholischen Gemeinden Bayerns. Solche Teilregelungen berücksichtigt das Script nicht; es rechnet mit der landesweit einheitlichen Lage. Für verbindliche Fristen fragt im Zweifel bei der zuständigen Stelle nach.

Verwandtes: Tage zwischen zwei Daten für den reinen Abstand, Osterdatum berechnen für die Formel im Detail und der Kalender mit Feiertagen für den Blick auf den ganzen Monat.

Datum & Uhrzeit Baujahr 2026 läuft in deinem Browser

Beide Randtage zählen mit. Ohne Gewähr — regionale Sonderregelungen innerhalb eines Landes sind nicht berücksichtigt.

Script von kostenlose-javascripts.de

So funktioniert das Script

Das Script besteht aus drei Teilen: der Osterformel, der Feiertagsliste und einer Schleife, die Tag für Tag durch den Zeitraum läuft und zählt. Der letzte Teil ist der einfachste — und für das Verständnis der wichtigste.

const laeufer = new Date(von);
while (laeufer <= bis) {
  …
  laeufer.setUTCDate(laeufer.getUTCDate() + 1);
}

Statt klug zu rechnen — Wochen mal fünf, Rest korrigieren, Feiertage abziehen — geht das Script schlicht jeden Tag einzeln durch. Bei einem Jahr sind das 365 Durchläufe, in weniger als einer Millisekunde erledigt. Der Vorteil: Es gibt keine Sonderfälle, keine Randfehler an Monats- und Jahresgrenzen und keine falsch behandelten Feiertage, die aufs Wochenende fallen. „Einfach durchzählen" ist bei überschaubaren Mengen fast immer die bessere Lösung als eine clevere Formel.

Der Trick beim Weiterzählen: setUTCDate(getUTCDate() + 1) kümmert sich selbst um Monats- und Jahreswechsel. Setzt man den 32. Januar, entsteht der 1. Februar.

const h = (19 * a + b - d - g + 15) % 30;
…
const monat = Math.floor((h + l - 7 * m + 114) / 31);

Das ist die Gaußsche Osterformel in der heute üblichen Fassung. Sie ist bewusst nicht zu „verstehen" wie eine gewöhnliche Rechnung — sie bildet die Kirchenregel nach: Ostern ist der erste Sonntag nach dem ersten Vollmond im Frühling. Beide Bestandteile stecken in den Restrechnungen: Der Mondzyklus von 19 Jahren erklärt das % 19 ganz oben, die Sieben-Tage-Woche das % 7 in der Mitte. Ostern kann damit zwischen dem 22. März und dem 25. April liegen.

const zurueck = wochentag >= 4 ? wochentag - 3 : wochentag + 4;
return verschoben(d, -zurueck);

Der Buß- und Bettag ist der Mittwoch vor dem 23. November. Diese Zeile rechnet aus, wie viele Tage vom 23. zurückzugehen sind. getUTCDay() liefert den Mittwoch als 3. Ist der 23. ein Donnerstag (4) oder später, liegt der gesuchte Mittwoch in derselben Woche; ist er Sonntag bis Mittwoch, muss eine ganze Woche weiter zurückgegangen werden. Fällt der 23. selbst auf einen Mittwoch, sind es sieben Tage zurück — der Feiertag liegt dann davor, nicht am 23. selbst.

tabelle[eintrag.datum.toISOString().slice(0, 10)] = eintrag.name;

Bevor die Zählschleife startet, werden alle Feiertage in eine Nachschlagetabelle geschrieben, deren Schlüssel das Datum in der Form 2026-04-03 ist. In der Schleife genügt dann ein einziger Zugriff je Tag statt einer Suche durch die ganze Liste. Bei neunzehn Feiertagen wäre der Unterschied nicht spürbar — das Muster lohnt sich aber zu kennen, denn bei größeren Datenmengen entscheidet es über Sekunden oder Minuten.

return eintrag.laender === null || eintrag.laender.indexOf(land) !== -1;

Jeder Feiertag trägt eine Liste der Länder, in denen er gilt — oder null für „bundesweit". Diese Unterscheidung als eigener Wert statt als Liste aller sechzehn Länder macht die Tabelle lesbar und Änderungen einfach: Kommt ein Feiertag hinzu, ist es eine Zeile.

Zum Anpassen: Für Betriebsferien oder eigene freie Tage ergänzt ihr die Liste um Einträge mit festem Datum. Soll eine Sechstagewoche gelten, entfernt ihr die 6 aus der Wochenendprüfung. Und wenn ihr statt der Anzahl das Datum sucht, das eine bestimmte Zahl von Arbeitstagen entfernt liegt, dreht ihr die Schleife um: weiterzählen, bis der Arbeitstagezähler den Zielwert erreicht.

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