Kalender-Algorithmen gibt es wie Sand am Meer. Hier eine neue Variante - ich beschreibe den Algorithmus:
Eine Funktion soll das Julianische Datum, das im wesentlichen einfach eine in der Astronomie gebräuchliche TagesZählung ist, in ein bürgerliches Datum umwandeln. Die aufeinanderfolgenden ZeitIntervalle werden wie eine Grammatik beschrieben. Die NichtTerminale der Grammatik sind die Symbole für den 400-JahresZeitRaum, zwei verschiedene JahrHunderte, zwei verschiedene VierJahresZeitRäume, zwei verschiedene Jahre und dreizehn Monate mit insgesamt vier verschiedenen Längen.
Jede der Prozeduren, die ein solches Symbol erkennt, weiß, wie lang der zugehörige ZeitRaum in Tagen ist. Von einem StartZeitPunkt ausgehend werden, beginnend mit dem 400-JahresSymbol, von dem vorgegebenen Julianischen Datum soviele Tage heruntergezählt wie diesem ZeitRaum entsprechen - parallel dazu wird ein achtstelliges Datum hinaufgezählt.
Das geschieht mehrfach, bis nicht mehr genug Tage für einen solchen Vorgang vorhanden sind. Dann kommt der nächstkleinere ZeitRaum dran. Dabei bestimmt die AufRufHierarchie die Abfolge der Jahre und SchaltJahre und der verschiedenen Monate.
Das EndDatum dann noch in die übliche Darstellung aus drei Zahlen umzuwandeln ist kein Problem mehr.
Damit man mit dem Code gleich was anfangen kann, habe ich ein primitives KommandozeilenProgramm beigefügt, das diese Funktion enthält und ein bißchen was nützliches tut. Es erlaubt einen SelbstTest "qcal -t" - wobei intern sämtliche Daten mit vierstelligen JahresZahlen durchgerechnet werden - und kleinere Berechnungen wie etwa die Ermittlung des AbStandes in Tagen zwischen zwei Daten.
Wenn dieser Algorithmus so noch nie veröffentlicht wurde, soll er der GNU Public License unterstellt werden.
Ein paar Beispiele.
qcal
Zeigt einen Hilfe-Text.
qcal -t
Führt den SelbstTest durch. Auf einem 450 MHz PIII etwa 9.2 Sekunden.
qcal -s 2001 2 9
oder kürzer
qcal 2001 2 9
Zeigt WochenTag und Julianisches Datum für den 9. Februar 2001.
qcal -s 2001 2 9 -f 2003 12 31
oder kürzer
qcal 2001 2 9 2003 12 31
Zeigt WochenTag und Julianisches Datum für den 9. Februar 2001 und den 31. Dezember 2003 sowie der AbStand zwischen diesen beiden Tagen (1055).
Bei den letzten beiden Beispielen ist zu bemerken, daß noch eine weitere Information angezeigt wird: Es handelt sich um einen 27 Stunden Rhythmus, der der gesamten ZeitAchse parallelgelegt wurde. Leser des WeltHöhlenZyklus werden leicht erraten, was das für ein Rhythmus ist.
qcal -s 2001 2 9 -d 100
oder kürzer
qcal 2001 2 9 -d 100
Zeigt WochenTag und Julianisches Datum für den 9. Februar 2001 und den 20. Mai 2001 an, der 100 Tage später ist.
qcal -s 2001 2 9 -d 14 -h qcal -s 2001 2 9 -w 2 -h qcal -s 1 1 1 -f 9999 12 31 -h
oder kürzer
qcal 2001 2 9 -d 14 -h qcal 2001 2 9 -w 2 -h qcal 1 1 1 9999 12 31 -h
Zeigen WochenTag und Julianisches Datum vom 9. Februar 2001 bis zum 23. Februar an. Delta-Angabe ist in Tagen (-d) oder Wochen (-w) möglich.
Das dritte Beispiel gibt etwa 3_650_000 Zeilen aus und beschäftigt den Rechner eine Weile!
qcal -s 2001 2 11 -d 20 -r qcal -s 2001 2 11 -w 3 -r qcal -s 2001 2 11 -d 41 -r qcal -s 2001 2 11 -w 6 -r
oder kürzer
qcal 2001 2 11 -d 20 -r qcal 2001 2 11 -w 3 -r qcal 2001 2 11 -d 41 -r qcal 2001 2 11 -w 6 -r
Die Option -r ist für die Erzeugung von LaufTageBuchBlättern vorgesehen, die ausgedruckt verwendet werden, um TrainingsLäufe zu notieren. Ein Blatt kommt in eine Datei und enthält eine ZeitRaum von drei Wochen. Dabei kommt nur ein ganz bestimmtes Raster von DreiWochenZeitRäumen zum Einsatz - entsprechen die Parameter diesen nicht, verweigert das Pogramm seine MitArbeit.
Die ersten beiden Beispiele erzeugen eine solche Datei, die zweiten beiden erzeugen zwei Dateien.
Die Dateien lassen an ihrem Namen erkennen, welchen ZeitRaum sie enthalten. Beispiele: sheet.388.2001-02-11.txt und sheet.389.2001-03-04.txt
Hier ist der Source-Code f5a8054c2d15b4d8a623ddc9d335c5a4 qcal.c.asc, der nur noch aus der PGP-signierten Datei herauspräpariert werden muß,
und das Linux-Binary 48b780d791e845a7f649e99212ca785e qcal, das sofort ablauffähig ist, wenn man mir traut.