Folgende Abschnitte zeigen verschiedene Datumsalgorithmen, welche in JavaScript dargestellt sind.
Berechnung des Schaltjahres
Um berechnen zu können, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht, muss man folgendes wissen. Unser
Kalendersystem wird als "Gregorianische Kalender" bezeichnet und das gilt seit dem 15. Oktober 1582. In diesem System ist definiert, dass ein Jahr ein Schaltjahr ist, wenn es durch 4 teilbar ist. Es ist jedoch kein Schaltjahr, wenn es außerdem durch 100 ohne Rest teilbar ist. Ist das Jahr wiederum durch 400 teilbar, so ist es trotzdem ein Schaltjahr.
Damit folgende Funktion auch die Schaltjahre vor 1582 korrekt berechnet, wurde darin außerdem der zu der Zeit geltende "Julianische Kalender" berücksichtigt. Dieser legt fest, dass ein Jahr ein Schaltjahr ist, wenn es sich durch 4 ohne Rest teilen lässt.
function istSchaltjahr (jahr) {
if (jahr % 4 != 0) return false;
if (jahr < 1582) return true;
if (jahr % 400 == 0) return true;
if (jahr % 100 == 0) return false;
return true;
}
Der Julianische Tag
Der Julianische Tag bezeichnet einen Tag in der Julianischen Periode. Diese Periode wurde von Joseph Justus Scaliger ermittelt und umfaßt 7980 Jahre. Die Periode beginnt am 1. Januar 4713 v.Chr. Beginnend von diesem Tag werden die Tage durchnumeriert. Auf der Basis dieser Periode lassen sich Daten unterschiedlicher Kalendersysteme ineinander umrechnen.
function JMT2Julian(jahr, monat, tag) {
var mjt;
var b;
if ( (jahr > 1582)
|| ( (jahr == 1582) && (monat > 10) )
|| ( (jahr == 1582) && (monat == 10)
&& (tag >= 15) ) )
b = Math.floor(jahr / 400)
- Math.floor(jahr / 100)
+ Math.floor(jahr / 4);
else
b = Math.floor( (jahr + 4716) / 4) - 1181;
if (monat <= 2) {
if (istSchaltjahr(jahr)) b = b - 1;
jahr = jahr - 1;
monat = monat + 13;
}
else monat = monat + 1;
mjt = 365 * jahr - 679004 + b
+ Math.floor(30.6 * monat) + tag;
return mjt + 2400001;
}
Mit folgender Funktion lässt sich aus dem Julianische Tag wieder ein gewöhnliches Datum ableiten:
function Julian2JMT(juliantag) {
var a, b, c, d, e, f, g, z;
var jahr, monat, tag;
z = Math.floor(juliantag + 0.5);
f = (juliantag + 0.5) - z;
if (z >= 2299161) {
g = Math.floor((z - 1867216.25) / 36524.25);
c = Math.floor(g / 4);
a = z + 1 + g - c;
}
else a = z;
b = a + 1524;
c = Math.floor((b - 122.1) / 365.25);
d = Math.floor(365.25 * c);
e = Math.floor(((b - d) / 30.6001));
z = Math.floor(30.6001 * e);
tag = Math.floor(b - d - z + f);
if (e > 13.5) monat = e - 13;
else monat = e - 1;
if (monat > 2.5) jahr = c - 4716;
else jahr = c - 4715;
return new Date(jahr, monat - 1, tag);
}
Testen Sie hier die Funktionen:
Berechnung des Tages im Jahr
Mit Hilfe des Julianischen Tages lässt sich der Tag des Jahres leicht ermitteln.
function TagImJahr(jahr, monat, tag) {
return JMT2Julian(jahr, monat, tag)
- JMT2Julian(jahr, 1, 1) + 1;
}
Berechnung des Wochentages
Die folgende Funktion berechnet den Wochentag eines Datums mit Hilfe des Julianischen Tages. Der Julianische Tag 0 ist ein Montag. Daher liefert
diese Funktion bei einem Montag den Wert 0, bei einem Dienstag den Wert 1, bei einem Mittwoch den Wert 2 usw.
function Wochentag(jahr, monat, tag) {
return JMT2Julian(jahr, monat, tag) % 7;
}
Berechnung der Kalenderwoche
Eine Kalenderwoche beginnt mit einem Montag. Die Kalenderwochen eines Jahres sind fortlaufend durchnummmiert. Einer Kalenderwoche wird immer genau eine Ordnungszahl zugeordnet, d.h. Wochen deren Tage teilweise im alten und teilweise im neuen Jahr liegen, stellen entweder die letzte Woche des alten oder die erste Woche des neuen Jahres dar. Die Kalenderwoche 1 ist die erste Woche des Jahres, deren Tage überwiegend im neuen Jahr liegen (nach DIN 1355 bzw. ISO 8601). Damit ist die erste Woche die Woche, in der der 4. Januar liegt und das ist wiederum die Woche, zu der der erste Donnerstag des Jahr gehört. Das Jahr hat entweder 52 oder 53 Kalenderwochen.
function Donnerstag(jahr, monat, tag) {
return JMT2Julian(jahr, monat, tag)
- Wochentag(jahr, monat, tag) + 3;
}
function Kalenderwoche(jahr, monat, tag) {
var dota = Donnerstag(jahr, monat, tag);
var jahrdota = Julian2JMT(dota).getFullYear();
var dota1 = Donnerstag(jahrdota, 1, 4);
return (dota - dota1) / 7 + 1;
}
Die Gaußsche Osterformel
Nachfolgende Funktion bildet die Formel von Carl Friedrich Gauß zur Berechnung des Ostersonntages ab. Als Ergebniswert liefert sie die Anzahl Tage, ab dem 1. März, bis zum Osterfeiertag. Die Funktion berücksichtigt außerdem die Erweiterungen zur Gaußschen Osterformel von Dr. Heiner Lichtenberg. Dadurch werden auch Jahreszahlen des Julianischen Kalenders (vor 1583) berücksichtigt. Die Änderungen beziehen sich auf den Quellcode in dem einen else-Zweig.
function Osterdatum (jahr) {
var k = Math.floor(jahr / 100);
if (jahr > 1582) {
var m = 15 + Math.floor( (3 * k + 3) / 4)
- Math.floor( (8 * k + 13) / 25);
var s = 2 - Math.floor( (3 * k + 3) / 4);
}
else {
var m = 15;
var s = 0;
}
var a = jahr % 19;
var d = (19 * a + m) % 30;
var r = Math.floor(d / 29)
+ ( Math.floor(d / 28)
- Math.floor(d / 29) )
* Math.floor(a / 11);
var og = 21 + d - r;
var sz = 7 - ((jahr + Math.floor(jahr / 4)
+ s) % 7);
var oe = 7 - ( (og - sz) % 7 );
return og + oe;
}
Besondere Tage im Jahr
Die Berechnung der besonderen Tage im Jahr erfolgt ausschließlich nach aktuellen deutschen Regelungen. Für frühere Jahre können durch Regeländerungen die Angaben daher falsch sein. Sämtliche Berechnungen basieren im Wesentlichen auf den oben vorgestellten Algorithmen. Gesetzliche Feiertage für Bayern mit überwiegend katholischer Bevölkerung sind mit einem Stern gekennzeichnet, sofern sie nicht zwangsläufig auf einen Sonntag fallen.
Anzahl Arbeitstage im Jahr
Die Berechnung der Arbeitstage ermittelt alle Tage eines Jahres abzüglich der Samstage und Sonntage und der sonstigen gesetzlichen Feiertage. Es werden die gesetzlichen Feiertage für Bayern mit überwiegend katholischer Bevölkerung berücksichtigt.