Einstieg in Java und OOP
Einstieg in Java und OOP - Das Buch

Datumsalgorithmen


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;
}
  
Testen Sie hier die Funktion:

Jahreszahl: 
Ergebnis:

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:

Datum: 
Julianischer Tag: 
Julianischer Tag: 
Datum: 

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;
}
  
Testen Sie hier die Funktion:

Datum: 
Tag im Jahr: 

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;
}
  
Testen Sie hier die Funktion:

Datum: 
WT: 

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;
}
  
Testen Sie hier die Funktion:

Datum: 
KW: 

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;
}
  
Testen Sie hier die Funktion:

Jahreszahl:
Osterdatum: 

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.


Jahreszahl: 


Mit festem Datum

Neujahr*
Heilige Drei Könige*
Valen­tins­tag
Frauentag
Maifeiertag, Tag der Arbeit*
Maria Himmelfahrt*
Tag der deutschen Einheit*
Refor­mations­tag, Hallo­ween
Aller­heiligen*
Aller­seelen
Martins­tag
Niko­laus­tag
Heilig­abend
1. Weihnachts­feiertag*
2. Weihnachts­feiertag*
Sil­vester


Abhängig vom Osterdatum

Während das Datum des Ostersonntags anhand der Gaußschen Osterformel ermittelt wird, besitzen alle weiteren Tage dieses Abschnitts ein fix definiertes Intervall an Tagen zu diesem Datum. Die Differenz zu Ostern wird in der rechte Spalte angegeben.

Rosen­montag
-48 Tage
Faschings­dienstag
-47 Tage
Ascher­mitt­woch
-46 Tage
Palm­sonntag
-7 Tage
Grün­donnerstag
-3 Tage
Kar­freitag*
-2 Tage
Oster­sonntag
0 Tage
Oster­montag*
+1 Tage
Christi Himmel­fahrt, Vatertag*
+39 Tage
Pfingst­sonntag
+49 Tage
Pfingst­montag*
+50 Tage
Fron­leich­nam*
+60 Tage


Abhängig vom Wochentag von Weihnachten

Der 4. Adventssonntag ist der letzte Sonntag vor dem 25.12., also vor dem 1. Weihnachtsfeiertag. Der späteste Termin für den 4. Adventssonntag ist somit Heiligabend. Alle weiteren Tage können als feste Tagesdifferenzen zum 4. Adventssonntag bestimmt werden. Die jeweiligen Differenzen sind in der rechten Spalte angegeben.

Volks­trauer­tag
-35 Tage
Buß- und Bet­tag
-32 Tage
Toten­sonntag
-28 Tage
1. Advent
-21 Tage
2. Advent
-14 Tage
3. Advent
-7 Tage
4. Advent
0 Tage


Abhängig von einer bestimmten Woche eines bestimmten Wochentags eines Monats

Die Sommerzeit beginnt am letzten Sonntag im März und endet am letzten Sonntag im Oktober. Diese Regelung gilt seit 1996 einheitlich innerhalb der Europäischen Union.

Beginn der Sommer­zeit
Ende der Sommer­zeit

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.


Jahreszahl: 
Anzahl Arbeitstage: