Eine Programmbibliothek zur Bestimmung des Zeitpunkts von Ereignissen.

Zweck

Die Programmbibliothek Zeitrechnung dient zur Bestimmung des Zeitpunkts von Ereignissen wie beispielsweise Feier- oder Gedenktage. Die Zeitpunkte solcher Ereignisse werden zu einem Teil nach Kriterien bestimmt, die mit dem Kalendersystem zu tun haben, das im jeweiligen Kulturkreis üblich ist oder war. Zu einem anderen Teil unterscheiden sich die Wege, wie unterschiedliche Ereignisse bestimmt werden auch, wenn sie im selben Kalendersystem bestimmt werden.

Die Zeitrechnung führt diese verschiedenen Wege der Bestimmung von Zeitpunkten zu einer gleichartigen Vorgehensweise zusammen und vereinfacht damit den Ablauf deutlich.

Ereignisse

Zentrales Element der Zeitrechnung sind ihre Ereignisklassen. Jede Ereignisklasse repräsentiert eine bestimmte Art von Ereignis. Die folgende Tabelle zeigt die Ereignisklassen, die mit der Zeitrechnung bestimmt werden können.

Ereignis-Typen

Nr Klasse Typ

1

DatumEreignis

Festes Datum im westlichen Kalender

2

TagWocheMonatEreignis

n-ter Tag in einem Monat z.B. dritter Mittwoch im Mai

3

TagDatumEreignis

Wochentag vor oder nach einem Datum, z.B. Totensonntag: fünfter Sonntag vor dem 24.12. oder Freitag vor dem Mittsommertag (24.6.)

4

OsterEreignis

Anzahl Tage vor oder nach Ostern

Die API-Dokumentation beschreibt die Ereignisklassen in allen Details.

Parameter

Jede Ereignisklasse erfordert eine Definition aus Parametern, die ein Ereignis der Klasse genau definiert. In der nachfolgenden Tabelle sind die Parameter genannt, mit denen ein Ereignis der jeweiligen Klasse definiert wird.

Nr p1 p2 p3 p4

1

Monat

Tag 1-31

-

-

2

Wochentag

Monat

wievielter, -1 = letzter

-

3

Wochentag

Monat

Tag 1-31

wievielter vor (-) oder nach

4

Anzahl Tage vor (-) oder nach Ostern

1=westlich, sonst orthodox

-

-

Als Monat wird ein Ganzzahl-Wert von 1 (Januar) bis 12 (Dezember) erwartet. Hierfür kann auch Definition.JANUAR, Definition.FEBRUAR genutzt werden. Als Wochentag gelten Ganzzahl-Werte von 0 (Sonntag) bis 6 (Samstag) oder auch Definition.MONTAG, Definition.DIENSTAG, usw.

Die Ereignisdefinition wird für ein Ereignisobjekt jeweils mit der Methode setDefinition gesetzt. So ergibt stets die Kombination aus Ereignisklasse und Ereignisdefinition die Art, wie dessen Zeitpunkt bestimmt wird.

Zeitpunkt bestimmen

Alle Ereignisklassen implementieren die Schnittstelle Ereignis und bieten damit eine einheitliche Form, wie der Zeitpunkt eines Ereignisses bestimmt werden kann.

Beispiel zur Bestimmung des Zeitpunkts von Ereignissen
// Ereignis-Definition befuellen
Definition def = new Definition();
def.setName("Muttertag");
def.setp1(Definition.SONNTAG);
def.setp2(Definition.MAI);
def.setp3(2);
// ein Ereignisobjekt erstellen
TagWocheMonatEreignis ereignis = new TagWocheMonatEreignis();
// dem Ereignis-Objekt die Definition uebergeben
ereignis.setDefinition(def);
// Zeitpunkt(e) bestimmen und ausgeben
List<Datum> zeitpunkte = ereignis.getZeitpunkte(2022);
for(Datum d : zeitpunkte) {
  System.out.println(def.getName() + ": " + d.getTag() + "." + d.getMonat() + "." + d.getJahr());
}

Zunächst wird ein Objekt der zum Ereignistyp passenden Klasse erstellt. Mit der Methode setDefinition werden dem Objekt die Parameter übergeben, die das Ereignis eindeutig definieren. Mit Aufruf der Methode getZeitpunkte wird eine Liste von Objekten der Klasse Datum ausgegeben, die alle Zeitpunkte im fraglichen Jahr kennzeichnet. In den allermeisten Fällen enthält die Liste ein Datum, aber es gibt Fälle, in denen ein Ereignis mehrmals in einem westlichen Jahr auftritt.

Kalender

Der Lauf der Zeit lässt sich an astronomischen Ereignissen wie dem Lauf der Erde um die Sonne sowie der Drehung der Erde um sich selbst oder auch dem Lauf des Mondes um die Erde erkennen. Die Himmelsmechanik bestimmt Tag, Nacht, Jahreszeiten und Jahre. Kalender bilden diese Ereignisse ab, indem sie die Zeit entsprechend in Tage, Wochen, Monate, Jahreszeiten und Jahre teilen und diese zählen.

Mit Kalendern lassen sich wiederkehrende Ereignisse wie Mondphasen, die Abfolge von Tagen, Jahreszeiten und Jahre bestimmen und einteilen.

In unterschiedlichen Kulturen fanden zu einer Zeit jeweils auch unterschiedliche Kalendersysteme Anwendung und tun es noch. Aus diesem Grund ergibt sich zur Verfolgung unterschiedlichster Ereignisse die Notwendigkeit, eine Möglichkeit zur Umwandlung zwischen verschiedenen Kalendersystemen zu schaffen, damit Ereignisse unterschiedlicher Kulturen, Orte und Zeiten unabhängig vom verwendeten Kalendersystem beobachtet und abgebildet werden können.

Kalendersysteme

Unser Kalender in der westlichen Welt beruht auf dem gregorianischen Kalendersystem, das in manchen Ländern am 15. Oktober 1582 und in anderen Ländern später in Kraft trat. Im Kontext der Programmbibliothek Zeitrechnung repräsentiert die Klasse Westlich den gregorianischen Kalender. Davor galt der von Julius Cäsar 45 v. Chr. eingesetzte Julianische Kalender.

Weitere Kalendersysteme, die weltweit verwendet werden sind das islamische Kalendersystem, das jüdische Kalendersystem, das traditionell chinesische Kalendersystem, das persische sowie das hinduistische Kalendersystem, die jeweils zur Abbildung und Bestimmung von in diesen Kulturen wichtigen Ereignisse dienen.

Da Ereignisse auf unterschiedlichen Kalendersystem beruhen können, ist eine zentrale Funktion der Zeitrechnung die Umrechnung eines Datums aus einem anderen Kalendersystem jeweils in das westliche Kalendersystem.

Umrechnung

Zur einheitlichen Umwandung von einem Kalendersystem in ein anderes dient ein generisches Datum, das auf der Zählung von Tagen beruht. Die Anzahl von Tagen seit einem bestimmten Starttag (vgl. Epoche) ist auch in der Astronomie ein bewährtes Mittel zur rechnerischen Verarbeitung von Zeitspannen (vgl. Julianisches Datum).

Die Programmbibliothek Zeitrechnung enthält zum Umrechnug zwischen Kalendersystemen Klassen, die ein bestimmtes Kalendersystem repräsentieren, z.B. die Klasse Westlich. Diese Klassen implementieren die Schnittstelle Wandler, die die Methoden zuTagen und vonTagen für die Wandlung zwischen einem Datum im jeweiligen Kalendersystem und der Anzahl Tage seit Beginn der Epoche vorsieht. Dabei wird für die Bestimmung der Anzahl von Tagen als Beginn der Epoche der 1. Januar 1 im gregorianischen Kalender festgelegt.

In Java

Die Methoden zur Ereignisbestimmung sind in der Programmiersprache Java geschrieben, die mit der Schnittstelle Calendar eine Möglichkeit etabliert, unterschiedliche Kalendersysteme abzubilden. Die Implementierung von Java in Form der Klasse GregorianCalendar vermischt jedoch das gregorianische und julianische Kalendersystem und bildet den Wechsel vom julianischen ins gregorianische Kalendersystem in einer Klasse ab.

Die Programmbibliothek Zeitrechnung geht einen anderen Weg und sieht für jedes Kalendersystem eine eigene Klasse vor. Hierbei wird auf viele Methoden der Schnittstelle Calendar verzichtet, die für die Bestimmung von Ereignissen nicht erforderlich sind. Dadurch entsteht eine von Grund auf eigene, schlanke und effiziente Implementierung.

Verwendung

Zur Verwendung der Programmbibliothek Zeitrechnung wird deren Java-Archiv heruntergeladen und dem Classpath eines Programmes beigegeben, das die Klassenbibliothek nutzen soll.

Lizenz

Die Programmbibliothek Zeitrechnung ist Freie Software und wird unter den Bedingungen der GNU Affero General Public License 3.0 bereitgestellt.

Lizenzhinweis

Teile der Programmbibliothek Zeitrechnung implementieren Algorithmen aus dem Buch "Calendrical Calculations: The Millenium Edition", Cambridge University Press von Edward M. Reingold und Nachum Dershowitz aus dem Jahr 2001. Das Buch wird von einer Implementierung in Lisp begleitet, die online erhältlich ist. Der Lisp Code wird unter folgenden Bedingungen öffentlich zugänglich gemacht:

  • Der Lisp Code kann für eigene Zwecke verwendet werden (for personal use).

  • Der Lisp Code kann für Demonstrationszwecke genutzt werden (demonstration purposes).

  • Die Verwendung des Lisp Codes für nicht-kommerzielle Zwecke unter Nennung der Urheber ist erlaubt (non-profit reuse with attribution).

  • Kommerzielle Nutzung des Lisp Codes sollte separat lizensiert werden, sie wird von der Lizenz des Lisp Codes nicht erlaubt.

Die Programmbibliothek Zeitrechnung ist keine Reimplementierung des Lisp Codes sondern eine eigene Implementierung einzelner Algorithmen des Buches in Java.