Unser Kalender Ein Wandelgang durch die Zeiten
|
1. Natürliche Zeiteinteilung
Die Orientierungshilfe, um sich in der unübersichtlichen Vergangenheit und der unbekannten Zukunft zurechtzufinden, ist der Kalender. Die beiden Eckpfeiler unseres - heute weltweit in Gebrauch stehenden - westlichen Kalenders sind die Einteilung in feste, sich regelmäßig wiederholende Zeitabschnitte und die Zählung dieser Abschnitte. Es sind vier natürlichen Zeitmaße die unseren Lebensrhythmus bestimmen und in unserem Kalender miteinander verknüpft werden:
Es wäre leicht, einen Kalender aufzustellen, wenn genau ein Vielfaches eines Tages einen Monat und ein Vielfaches des Monats ein Jahr ausmachen würde. Leider ist dem aber nicht so. Tatsächlich fallen im Mittel in das tropische Jahr 365,2422 Tage und 29,5306 Tage in den synodischen Monat.
So hat es im Laufe der Geschichte in fast jeder Kultur einen anderen Kalender gegeben. In den frühen Kulturen herrschte zumeist das Mondjahr vor, welches durch die Abfolge von zwölf Monaten bestimmt wurde. Um die Übereinstimmung mit den Jahreszeiten herzustellen wurde zumeist ein Schaltmonat eingelegt. Die Ägypter hatten schon von Alters her ein Sonnenjahr, welches 365 Tage umfaßte. Zwar wurde bereits im Jahre 238 v. Chr. vom damaligen Pharao Ptolemäus III ein Schaltjahr eingeführt, aber schon sein Nachfolger schaffte es wieder ab. Erst Julius Cäsar hat diese Schaltregel wieder in seinem Kalender aufgenommen.
2. Julius Cäsar und der Kalender
Der römische Kalender war ursprünglich ein reiner Mondkalender. Das Jahr begann im März und zählte 304 Tage und war in 10 ungleiche Monate zu 29 und 30 Tagen eingeteilt. Bereits im 7. Jahrhundert v. Chr. (vermutlich durch Tarquinius Priscus) wurde das Jahr durch Einfügen der Monate Januar und Februar auf 355 Tage verlängert. Um im Einklang mit dem natürlichen Jahresrythmus zu bleiben, wurden alle zwei bis drei Jahre Schaltmonate eingefügt. Durch ungeordnetes Einfügen der Schaltmonate, welches auch auf die Bestechlichkeit der damaligen Priesterkaste zurückgeführt werden kann, war auch dieser Kalender im Laufe der Zeit für das bürgerliche Leben unbrauchbar geworden.
Zur Beendigung dieser Mißstände setzte Julius Cäsar den Kalender des Astronomen Sosigène aus Alexandria per Gesetz durch. Im Jahr 45 v. Chr. wurde der römische Kalender in fünf Punkten reformiert:
Die Einführung des neuen Kalenders brachte ein "Konfusionsjahr" mit sich, da es galt den Jahresbeginn vom März auf den Januar – das war der Amtsantritt der Konsuln - vorverlegt. Das Jahr 46 v. Chr. hatte 455 Tage.
Auf die römische Tradition gehen auch die Monatsnamen zurück.
Martius | September | |
Aprilis | Oktober | |
Maius | November | |
Junius | Dezember | |
Quintilis | Januarius | |
Sextilis | Februarius |
Die Genauigkeit dieses Kalenders konnte innerhalb einer Generation nicht bemängelt werden. So verhalf die militärische Macht Roms dem Kalender innerhalb kürzester Zeit zur Verbreitung in der "ganzen bekannten Welt". Aber erst das Christentum hat diesem Kalender zum wirklichen Siegeszug verholfen, mit der einzigen Änderung, dass der Beginn der Zeitrechnung von der Gründung Roms auf den vermutlichen Zeitpunkt von Christi Geburt gelegt wurde.
3. Der Kalender und das Christentum
Die Bestimmung des Osterfestes war zwischen östlichen und westlichen Kirchen umstritten, gleichwohl hatte die christliche Kirche großes Interesse daran, dass das Osterfest von der gesamten Christenheit am selben Tag gefeiert wird. Des weiteren sollte Ostern seinen Bezug zu den biblischen Texten behalten. Auf dem Konzil von Nicäa (325 n.Chr.) wurde empfohlen, dass Ostern am Sonntag nach dem ersten Vollmond nach Frühlingsanfang (Tag-und-Nacht-Gleiche auf der nördlichen Halbkugel) gefeiert werden sollte. Deshalb erteilte Papst Johannes I. dem skythischen Mönch Dionysius den Geringen (Dionysios Exiguus, ca. 500 n.Chr.) den Auftrag die Ostertafeln neu zu ordnen. Dieser setzte im Jahr 525 n.Chr. die folgende Formel durch:
3.2 Die Bestimmung der christlichen Epoche
Zur Zeit des Abtes Dionysios Exiguus war es üblich, die Jahre des Julianischen Kalenders nach der sogenannten "Märtyrer-Ära" zu rechnen, die mit dem Amtsantritt von Diokletian im Jahre 284 n.Chr. begann. Exiguus fand es würdiger, den Verlauf der Jahre nach der Menschwerdung Christi zu bezeichnen. Er versuchte den Zeitpunkt der Geburt Christi nachträglich festzulegen. Dies war 500 Jahre später keine einfache Aufgabe. Dionysios griff auf den Zyklus des Victorius von Aquitanien zurück, der 532 Jahre betrug (Mondzyklus * Sonnenzyklus: 19 Jahre * 28 Jahre). Im Jahr 525 setzte er schließlich das 248. Jahr nach Diokletian mit dem Jahre 532 n.Chr. gleich und nannte die neugezählten Jahre anni domini nostri Jesu Christi, die Jahre unseres Herrn Jesus Christus. Die Einführung von Christi Geburt als Bezugspunkt der Jahreszählung war somit ein Nebenprodukt der Arbeit an den Ostertafeln. Diese Zählweise erlangte schon bald weite Verbreitung. Etwa ab 1000 war sie überall in Europa gebräuchlich; die Päpste benutzten sie offiziell allerdings erst ab 1431.
Bereits Johannes Kepler wies darauf hin, dass die Bestimmung fehlerhaft sei, da die Berechnung des Sterns von Bethlehem, nach geltender astronomischer Einschätzung eine enge Zusammenkunft der Planeten Jupiter und Saturn, im Jahre 7 vor Beginn unserer Zeitrechnung liegt.
4. Der Oktober 1582
Die Verwendung des julianischen Kalenders führte dazu, dass sich bis Mitte des 16. Jahrhunderts der Frühlingsanfang um 11 Tage in Richtung Jahresanfang verschoben hatte. Dies rückgängig zu machen und anschließend dauerhaft zu verhindern war das Ziel einer Kalenderreform. Der dabei entstandene und heute noch gültige gregorianische Kalender geht auf die Arbeiten von Aloysius Lilius (gest. 1576) und Christopher Clavius (1537 - 1612) zurück. In einer päpstlichen Bulle vom 24. Februar 1582 legte Papst Gregor XIII fest:
Einführungsjahr |   | |
---|---|---|
Frankreich | 1582 | |
Italien | 1582 | |
kath. Deutschland | 1582 | |
Spanien | 1582 | |
Dänemark | 1699 | |
prot. Deutschland | 1700 | |
Großbrittannien | 1752 | |
Schweden | 1753 | |
Japan | 1873 | |
Ägypten | 1875 | |
China | 1912 | |
Rußland | 1918 | |
Griechenland | 1923 |
Vor allem wohl, weil es unterlassen wurde auf den wissenschaftlichen Hintergrund der Kalendernovellierung hinzuweisen wurde der gregorianische Kalender zunächst nur von den katholischen Ländern eingeführt. Andere Länder ließen sich damit mehr Zeit. Im gesamten Bereich der heute Deutschland ist galt er erst ab 1700. Die Einführung in der Türkei hat bis 1927 gedauert. Daher stimmen mitunter historische Datierungen und die regionale Gegebenheit scheinbar nicht überein. So wurde die Oktoberrevulotion in der Sowjetunion "erst" im November gefeiert.
Da der gregorianische Kalender mit dem Jahr Eins nach Christi Geburt beginnt und kein Jahr Null kennt, muss bei der Berechnung von Zeitintervallen über die Geburt Christi hinaus stets ein Jahr abgezogen werden, da dem Jahr 1 n.Chr. das Jahr 1 v.Chr. vorausging. (Demzufolge beginnt das dritte Jahrtausend des gregorianischen Kalenders erst mit dem Jahreswechsel von 2000 auf 2001.)
5. Die Normung des Kalenders
Die Macht Roms und die Verbreitung des Christentums hat dazu geführt, dass der julianische Kalender der allgemein gültige Kalender für Europa während des gesamten Mittelalters war. Angesichts der Zersplitterung in Einzelstaaten ein kaum vorzustellender Zustand. Zwar hatte der gregorianische Kalender seine Anlaufschwierigkeiten, aber seit der Mitte dieses Jahrhunderts wird er weltweit, unabhängig der Religion, eingesetzt.
Da der Kalender so außerordentlich wichtig für das öffentliche Leben war und ist, wird es niemanden verwundern, dass sich Normungsgremien dem Kalender angenommen haben und in nationale bzw. internationale Normen überführt haben. In Deutschland wurde die DIN 1355 erstellt, welche inhaltlich der ISO/R 2015-1971 gleicht. Festgelegt wurden darin Jahreslänge, Schaltregeln, Monats- und Wochentagsnamen (inkl. Abkürzungen), die Schreibweisen für "vor Christus" und "nach Christus" sowie Jahres- und Wochenzählung. Die DIN-Norm ist dann in die europäische Norm EN 28601 überführt worden. Inhaltlich beschreiben die Normen das, was bereits in der päpstlichen Bulle von 1582 aufgeführt wurde. Sie gehen nur dann über die dort getroffenen Regelungen hinaus, wo diese ungenau ist.
6. Algorithmen zur Datumsberechnung
Die in den nachfolgenden Unterkapiteln aufgeführten Berechnungsalgorithmen sind als Programmierhilfe gedacht und können bei Bedarf kopiert und angepaßt werden. Eine Gewährleistung für die Korrektheit der auf dieser Seite verwendeten oder beschriebenen Algorithmen gebe ich nicht, auch wenn die Algorithmen von mir getestet wurden und ich die ausgemachten Fehler nach besten Wissen beseitigt habe. Also: Alles ist "AS IS" und Gewährleistungen und Garantien gibt es für gar nichts.
6.1 Die Berechnung des Schaltjahres
Die hier aufgeführte Funktion ermittelt für ein gegebenes Jahr, ob es sich
dabei um ein Schaltjahr handelt. Zurückgegeben wird ein entsprechender
Wahrheitswert; die Verwendung eines Integerwertes in dieser Funktion bietet
den Vorteil das Ergebnis verrechnen zu können, z.B.
Anhand des Vergleiches mit der Zahl 1582 wird ermittelt, ob die julianische oder gregorianische Schaltregel verwendet werden muss: Nach der julianischen Regel ist jedes vierte Jahr ein Schaltjahr, und nach der gregorianischen Regel ist jedes vierte Jahr nur dann ein Schaltjahr, wenn es nicht ohne Rest durch hundert teilbar ist, es sei denn, die Jahreszahl ist durch vierhundert ohne Rest teilbar. (vgl. Der Oktober 1582 auf dieser Homepage)
function ist_Schaltjahr(jahr) { if (jahr % 4 == 0) if (jahr < 1582) return 1; else if (!(jahr % 100 == 0)) return 1; else if (jahr % 400 == 0) return 1; return 0; } |
Übrigens gilt diese Schaltjahrfunktion nur für die Jahre nach Christi Geburt. Da es kein Jahr 0 gab, und daher der Vorgänger des Jahres 1 n.Chr. das Jahr 1 v.Chr. ist, ist ein Jahr vor Christigeburt dann ein Schaltjahr, wenn die ganzzahlige Division durch vier als Rest 1 ergibt. (Jahre vor Christus werden in diesen Scripten an anderer Stelle blockiert.)
6.2 Berechnung des Tag des Jahres
Hier werden einfach stur die Anzahl der Tage der vergangenen Monate aufsummiert und die verstrichenen Tage des gegebenen Monats hinzuaddiert. Dazu werden die jeweiligen Tageszahlen in einem Array (Feld) gespeichert. Vor der Berechnung wird die genaue Tageszahl für den Februar bestimmt (im Schaltjahr 29).
var Monatstage = new Array (31,28,31,30,31,30,31,31,30,31,30,31); ... function Tag_des_Jahres(tag,monat,jahr) { var Tage = 0; Monatstage[1] = 28 + ist_Schaltjahr(jahr); if (tag <= Monatstage[monat-1]) { for (var i=0; i < monat-1; i++) Tage = Tage + Monatstage[i]; Tage = Tage + tag; } return Tage; } |
Ein besonderes Problem liegt aber im Jahr 1582 vor, weil in diesem die 10 Tage zwischen dem 4. und 15. Oktober ausgefallen sind. Um dieses Jahr auch korrekt abbilden zu können, muss eine entsprechende Ausnahme gebildet werden. Eine analoge Verfahrensweise wie im Februar ist nicht möglich, da dann Datümer ab dem 21. Oktober nicht mehr zulässig sind. Man zieht am besten am Ende der Prozedur zehn Tage ab, wenn die Tagesanzahl größer als 287 (4. Oktober 1582) ist. Bei der Rückrechnung eines Datums aus der Tageszahl muss dann entsprechend aufgepaßt werden.
6.3 Wochentagsberechnung
Die Berechnung des Wochentages ist prinzipiell recht einfach, wenn erst der
Wochentag eines bestimmten Tages bekannt ist, können alle anderen Tage abgezählt
werden. Dies ist auch das Schema hier: Zunächst wird der Wochentag für den ersten
Januar bestimmt, und dann wird der gewünschte Tag "abgezählt"
Die Funktion CurrentDoomDay berechnet den Wochentag des ersten Tages des Jahres. Dazu muss man wissen, dass die Wochentage des 1. Januar der Jahrhunderte im gregorianischen Kalender immer wieder gleich beginnen. Ist das Jahrhundert (die ersten beiden Stellen des Jahres) glatt durch vier teilbar, fängt es mit einem Samstag an. Ergibt sich bei der Teilung ein Rest von 1 ist es Freitag, ... (Die Zahl in CenturyDoomDay bezieht sich auf die Position in WochenTage.)
var WochenTage = new Array ("Mo","Di","Mi","Do","Fr","Sa","So"); ... function CurrentDoomDay(jahr) { var CenturyDoomDay = new Array (5,4,2,0); var CC = Math.floor(jahr/100); var YY = jahr%100; var CCDoomDay = CenturyDoomDay[CC%4]; var YYDoomDay = 0; if (YY == 0) YYDoomDay = CCDoomDay; else if (YY%12 == 0) YYDoomDay = (CCDoomDay + YY/12 - 1) % 7; else YYDoomDay = ( CCDoomDay + (Math.floor(YY/12) + (YY%12) + Math.floor(((YY-1)%12)/4)) ) % 7; if ((CC%4 == 0) && (YY != 0)) YYDoomDay = YYDoomDay + 1; return YYDoomDay; } |
Interessanterweise erhöhen sich die Wochentage eines Datums nach zwölf Jahren um eines, also ist der 12. März 1958 ein Mittwoch und der 12. März 1970 ein Donnerstag. Es ergibt sich also für den 1. Januar eines beliebigen Jahres: Wie oft hat sich seit Beginn des Jahrhunderts der Wochentag um eins verschoben (ganzahliges Teilen durch 12) und um wieviel Resttage verschiebt es sich weiter? Bei den Resttagen ist es wichtig, zu wissen wieviel Schaltjahre darin sind, also durch 4. Diese drei Zahlen aufaddiert und durch sieben geteilt, ergibt der Rest die Verschiebung des Wochentages seit Beginn des Jahrhunderts. (vgl. Doomsday Algorithm) Dies abgebildet auf die WochenTage wird zurückgegeben.
Leider hatte sich in meinem ursprünglichen Algorithmus ein Fehler eingeschlichen, der aber von Sven Schottke erkannt und auch behoben werden konnte. Hier jetzt also die korrigierte Version.
6.3.2 Ein beliebiger Tag im Jahr
var WochenTage = new Array ("Mo","Di","Mi","Do","Fr","Sa","So"); ... function Wochentag(tag,monat,jahr) { var WchTag1Jan = CurrentDoomDay(jahr); var Tage = Tag_des_Jahres(tag,monat,jahr) - 1; var Wochentag = (WchTag1Jan+(Tage%7))%7; return WochenTage[Wochentag]; } |
Wenn der Wochentag des ersten Januars eine Jahres erst bekannt ist (CurrentDoomDay), dann ist die Ermittlung des Wochentages eines beliebigen Tages des Jahres einfach. Dazu wird zunächst die Tageszahl für das Datum berechnet. Wenn man die Vielfachen von 7 daraus weg läßt, ergibt sich die Verschiebung zum 1. Januar. Dieses brauch dann nur noch auf unser bereits bekanntes WochenTage-Feld abgebildet werden.
Eine andere Art den Wochentag zu bestimmen, ergibt sich über die julianische Tageszahl Da diese als Tag Null Montag, den 1. Januar 4713 n.Chr. angibt, ergibt der Rest der ganzzahligen Division des julianischen Tages mit sieben den jeweiligen Wochentag.
Anmerkung: Der bisher hierfür gemeldete Fehler, resultiert aus einem Fehler in der Berechnung des Wochentages des 1. Januars des aktuellen Jahres. Der Fehler steckte also nicht in dieser Prozedur, sondern in CurrentDoomDay. Zu dem Fehler ist es gekommen, weil die Übernahme des Doomsday-Algorithmus eine Korrektur verlangt, wenn nicht der letzte des Februars sondern der erste Januar als Doomsday benutzt wird. Hierdurch verschiebt sich nämlich die zwölfer Periode innerhalb des Jahrhunderts.
6.4 Die Bestimmung der Kalenderwoche
Prinzipiell könnte man die zugehörige Kalenderwoche zu einem Datum berechnen, indem man ermittelt um welchen Tag des Jahres es sich handelt und diesen dann durch sieben teilt. Eine Kalenderwoche beginnt aber laut der DIN 1355 - Zeit immer Montags, so dass hierzu zunächst bestimmt werden muss, wann die erste Woche des Jahres beginnt.
function Kalenderwoche(tag,monat,jahr) { var Woche = 0; var Wchtag1Jan = CurrentDoomDay(jahr); var Tage = Tag_des_Jahres(tag,monat,jahr)-1; if (Wchtag1Jan > 3) Tage = Tage - (7 - Wchtag1Jan); else Tage = Tage + Wchtag1Jan; if (Tage < 0) if ( (Wchtag1Jan == 4) || (CurrentDoomDay(jahr-1) == 3)) Woche = 53; else Woche = 52; else Woche = Math.floor(Tage/7) + 1; if ((Tage > 360) && (Woche > 52)) { if (Wchtag1Jan == 3) Woche = 53; else if (CurrentDoomDay(jahr+1) == 4) Woche = 53; else Woche = 1; } return Woche; } |
Dieser Algorithmus berechnet zunächst den Jahrestag des Datums, und dann wird die Tagesanzahl so korrigiert, dass beginnend vom ersten Montag des Jahres gerechnet wird. Dies funktioniert gut für 51 Wochen des Jahres, Probleme bereiten die ersten und die letzten Tage des Jahres. Sofern eine negative Tageszahl ermittelt wurde, liegen die ersten Tage eines Jahres in der letzten Woche des Vorjahres. Dabei muss berücksichtigt werden, dass ein Jahr eine 53. Woche hat, wenn es mit einem Donnerstag beginnt oder endet. Genauso muss für die letzten Tages des Jahres bestimmt werden, ob sie in der letzten Woche des aktuellen Jahres liegt, oder aber bereits in der ersten Woche des Folgejahres.
6.5 Die Osterfeiertage
Zur Berechnung des Osterfeiertages können Tabellen herangezogen werden, oder aber die Formeln von Carl Friedrich Gauß. Die Herleitung dieser Formeln ist nicht trivial. Daher habe ich mich darauf verlassen, dass die Darstellung bei Werner Nüssler die richtigen Ergebnisse liefert. Zur Probe habe ich einige Osterfeiertage berechnet und mit eine Tabelle der Osterfeiertage verglichen. Ich gestehe ganz ehrlich: Ich weiß zwar nicht warum, aber die Berechnung der Termine funktioniert. Allerdings nur für die Osterfeste im gregorianischen Kalender [erweitert am 17. 1. 2001].
function Ostersonntag(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 + A/11)/29); var OG = 21 + D - R; var SZ = 7 - ((jahr+Math.floor(jahr/4)+S) % 7); var OE = 7 - ((OG-SZ)%7); return (OG+OE); } function Feiertage(jahr) { var i = 0; var l_day = 0; var l_month = 0; var tdj = 0; var OS = Ostersonntag(jahr); l_tdj = Tag_des_Jahres(1,3,jahr)-1 + OS; while (l_tdj > 0) { l_tdj = l_tdj - Tage_pro_Monat[i]; i++; } l_month = i; l_day = Tage_pro_Monat[i-1] + l_tdj; if (l_tdj > 0) l_day = l_day + 1; document.ostern.dd.value = l_day; document.ostern.mm.value = l_month; return; } |
Die Funktion Osterfeiertag bildet die gausschen Formeln ab, in einer Form die der Berechnung mittels Computer dienlicher ist. Der zurückgegebene Wert entspricht der Anzahl Tage, ab Anfang März, bis zum Osterfeiertag. Der 32. Tag entspricht dann dem 1. April usw. Die Funktion Feiertage bildet nun den erhaltenen Wert wieder auf den Kalender ab und füllt die Felder in der HTML-Seite.
Anhand des Ostertermins lassen sich weitere besondere Kalender- und Feiertage berechnen: 46 Tage vor Ostern ist Aschermittwoch. 39 Tage nach Ostern ist Himmelfahrt, 49 Tage nach Ostern ist Pfingsten und 60 Tage nach Ostern ist Fronleichnam.
Anmerkung: Dr. Heiner Lichtenberg, der Autor der Korrekturen an der Gaußschen Osterformel, hat mich darauf hingewiesen, dass die Formel auch den Ostersonntag für den Julianischen Kalender berechnet, wenn M konstant auf 15 und S konstant auf 0 gesetzt wird. (So geschehen 17. 1. 2001. Vielen Dank.)
Die Arbeit von Dr. Lichtenberg mit dem Titel "Zur Interpretation der
Gaußschen Osterformel und ihrer Ausnahmeregeln" ist zu finden in der
(US-amerikanischen, wissenschaflichen) Zeitschrift "Historia Mathematica"
Band 24 (1997). In (fast) allen mathematischen Hochschulbibliotheken kann die HM
eingesehen werden. Eine Kurzfassung findet man unter der Netzadressse:
(www.idealibrary.com/links/doi/10.1006/hmat.1997.2170)
Hintergründe (ohne mathematische Exerzitien) stehen im Sonderheft 5 der
Zeitschrift Sterne und Weltraum
6.6 Der julianische Tag
Das julianische Datum 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. (Astronomisch: -4712), übrigens ein Montag. Beginnend von diesem Tag werden die Tage durchnumeriert. Auf der Basis dieser Periode lassen sich Datümer unterschiedlicher Kalendersysteme ineinander umrechnen, wobei ich bisher kein Beispiel gefunden habe.
function JulianDayNumber(tag,monat,jahr) { var MJDN = 0; /* Modified Julian Day Number */ var B = 0; if (is_greg_Date(tag,monat,jahr)) B = Math.floor(jahr/400) - Math.floor(jahr/100) + Math.floor(jahr/4); else B = Math.floor((jahr+4716)/4) - 1181; if (monat <= 2) { B = B - ist_Schaltjahr(jahr); jahr = jahr - 1; monat = monat + 13; } else monat = monat + 1; MJDN = (365*jahr) - 679004 + B + Math.floor(30.6*monat) + tag; return (MJDN + 2400001); } |
Durch die Historie unseres Kalenders (vgl. Kapitel 1 bis 4
auf dieser Homepage) ist die Umrechnung eines Datums in den julianischen Tag nicht
ganz trivial. In der Tat habe ich lange im Internet gesucht, bis ich die Formel aus
der Sammlung von Rolf Pfister zur Berechnung des julianischen Datums gefunden hatte
Der Begriff "Julianisches Datum" wird häufig auch verwendet für die
Numerierung des Tages im laufenden Jahr (vgl. Tag des Jahres). Die
fortlaufende Numerierung einer Zeiteinheit innerhalb einer Periode oder
ab einem bestimmten Zeitpunkt findet sich in der Informatik immer wieder.
So werden Zeiten und Datümer von Betriebssystemen intern häufig in Form
von Sekunden seit dem
A. Weitere Datumsalgorithmen
Die nachfolgend aufgeführten Berechnungsalgorithmen sind - wie bereits in Kapitel 6 - als Programmierhilfe gedacht und können bei Bedarf kopiert und angepaßt werden. Eine Gewährleistung für die Korrektheit der hier verwendeten oder beschriebenen Algorithmen wird nicht gegeben, auch wenn die Algorithmen von mir getestet wurden und ich die ausgemachten Fehler nach besten Wissen beseitigt habe. Also: Alles ist "AS IS" und Gewährleistungen und Garantien gibt es für gar nichts.
Anmerkungen zur Notation vergleiche Kapitel 6.
a. DatumsdifferenzenNachdem eine Reihe von Algorithmen zur Berechnung einzelner Datümer oder Eigenschaften vorgestellt worden sind, soll hier noch eine Prozedur zur Berechnung von Differenzen erläutert werden. Grundsätzlich lassen sich zwei Formen unterscheiden: Zum Einen die direkte Rechnung über Tag, Monat und Jahr und zum Anderen die vielleicht elegantere Umrechnung über den Julianischen Tag. Für die erste Form sind die erforderlichen Grundalgorithmen bereits vorgestellt worden, bis auf die Berechnung der Anzahl der Tage eines Jahres:
function Tage_pro_Jahr(jahr) { return 365 + ist_Schaltjahr(jahr); } |
Das ist nun wirklich eine banale Funktion, aber wenn sie oft benötigt wird, ist es sinnvoll sie in dieser Form zu erstellen. Somit sind jetzt alle notwendigen Funktionen vorhanden, um die Differenz zwischen zwei Datümern auf der Basis Tag / Monat / Jahr zu berechnen.
function Tage_von_bis(a_tag,a_monat,a_jahr,b_tag,b_monat,b_jahr) { var anz = 0; var a_Tage = Tag_des_Jahres(a_tag,a_monat,a_jahr); var b_Tage = Tag_des_Jahres(b_tag,b_monat,b_jahr); if ((a_jahr > b_jahr) || ((a_jahr == b_jahr) && (a_Tage > b_Tage))) { c_tag = a_tag; c_monat = a_monat; c_jahr = a_jahr; a_tag = b_tag; a_monat = b_monat; a_jahr = b_jahr; b_tag = c_tag; b_monat = c_monat; b_jahr = c_jahr; } if (a_jahr == b_jahr) anz = b_Tage - a_Tage; else { anz = Tage_pro_Jahr(a_jahr) - a_Tage; jahr = a_jahr + 1; while (jahr < b_jahr) { anz = anz + Tage_pro_Jahr(jahr); jahr++; } anz = anz + b_Tage; } return anz; } |
Problematisch bei der Berechnung der Differenz ist die Frage: Gehören die Grenztage zur Differenz hinzu oder nicht? Rein rechnerisch ist die Differenz von 5 und 7 gleich 2. Aber wieviel Tage sind es vom 5. eines Monats bis zum 7.? Sind es zwei Tage oder sind es drei, da der 5. sowie der 7. erst einmal vorbei sein müssen? Bei den vorgestellten Algorithmen wurde die "rein rechnerische" Variante gewählt. Wem die andere(n) besser gefällt, muss entsprechend korrigieren.
b. AltersberechnungWer das Profil einer Person auf seinen Webseiten darstellt, der möchte nicht immer die Seite erneuern, wenn die Person ein Jahr älter geworden ist. Hierfür bietet es sich dann an, das Alter zu berechnen und dynamisch auf der Seite auszugeben. Dazu wird zunächst das aktuelle Datum ermittelt, welches auf dem lokalen Rechner (!) eingestellt ist. Dann bestimmt man, ob der Geburtstag bereits gewesen ist oder noch kommt; hierdurch wird das Jahr korrigiert. Die Differenz des korrigierten aktuellen Jahres und dem Geburtsjahr ergibt dann das Alter.
var dat = new Date(); /* Ermittelt das aktuelle Datum */ function Alter(GebTag,GebMonat,GebJahr) { var jahr = current_year(); var monat = dat.getMonth() + 1; var tag = dat.getDate(); if (monat < GebMonat) jahr = jahr-1; else if ((monat == GebMonat) && (tag < GebTag)) jahr = jahr-1; return(jahr-GebJahr); } |
Auf einer Webseite kann das Alter dann mit document.write(Alter(12,3,1958)); ausgegeben werden: (Das ganze funktioniert allerdings nur wenn der Browser auch JavaScript ausführt.)
c. Der verstrichene TerminWie peinlich kann es sein, nicht an einen Termin gedacht zu haben. Auf einer Webseite kann es auch peinlich sein an einen Termin zu erinnern, obwohl dieser bereits verstrichen ist. Der hier vorgestellt Algorithmus löst diese Problem, indem anhand des lokalen Datums berechnet wird, ob ein gegebenes Datum bereits überschritten ist oder nicht. Auch hierzu wird zunächst das aktuelle Datum ermittelt, um dann festzustellen ob es bereits nach dem gewünschten Termin liegt.
var dat = new Date(); /* Ermittelt das aktuelle Datum */ function verstrichen(a_tag,a_monat,a_jahr) { var b_tag = dat.getDate(); var b_monat = dat.getMonth()+1; var b_jahr = current_year(); if (a_jahr > b_jahr) return false; else if ((a_jahr == b_jahr) && (a_monat > b_monat)) return false; else if ((a_jahr == b_jahr) && (a_monat == b_monat) && (a_tag > b_tag)) return false; return true; } |
Abhängig vom Ergebnis dieser Funktion kann dann wiederum ein Veranstaltungshinweis auf einer Seite wiedergegeben werden oder nicht.
B. Begriffslexikon
Fußnoten:
[1] | Das Plural von Datum ist laut Duden Daten und nicht Datümer. In der Informatik wird sprachlich jedoch häufig "Datümer" benutzt, um Datenfelder die Daten enthalten leichter von denen unterscheiden zu können in denen die Dateninhalte ein Datum beinhalten. |
Verweise | ||
---|---|---|
(Ich bin nicht verantwortlich für Inhalte externer Internetseiten.) |
[Seitenanfang] | geändert: 05.02.2004 by hgm |
© 1999, Hans-G. Mekelburg, all rights reserved. [ impressum |; datenschutz | haftungsausschluss ] |