Infos zu den Feiertagen
Das Datum des Osterfestes
Die Osterformeln
Sonnenauf- und untergang berechnen
Heute ist Mittwoch der 08. Februar 2012
Der ausgewählte Tag war/ist Mittwoch der 08. Februar 2012.
Sonnenaufgang am Mittwoch den 08. Februar 2012 ist um: 07:16 Uhr,
Sonnenuntergang um: 16:43 Uhr.
Danke an Jan für den Hinweis auf Sommerzeit!
| Januar 2012 |
| Woche | Mo |
Di | Mi | Do | Fr |
Sa | So |
| 52 | | | | | | | 1 | | 01 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | 02 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | | 03 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | | 04 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | | 05 | 30 | 31 | | | | |
|
| Februar 2012 |
| Woche | Mo |
Di | Mi | Do | Fr |
Sa | So |
| 05 | | | 1 | 2 | 3 | 4 | 5 | | 06 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | | 07 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | | 08 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | | 09 | 27 | 28 | 29 | | | |
|
| März 2012 |
| Woche | Mo |
Di | Mi | Do | Fr |
Sa | So |
| 09 | | | | 1 | 2 | 3 | 4 | | 10 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | | 13 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|
|
In grüner Farbe ist der gewählte Tag unterlegt, in blau der heutige Tag und die grau unterlegten Tage mit roter Schrift sind Feiertage. Um welche es sich dabei genau handelt, läßt sich erkennen, wenn man mit der Maus etwas auf der Ziffer verweilt...
Infos zu den Feiertagen
Für die Berechnung der deutschen / christlichen Feiertage ist zum größten Teil der Ostersonntag von
entscheidender Bedeutung. Daher verwundert es auch nicht, daß es in PHP die Funktion
easter_date() gibt.
Mit dieser Funktion nimmt PHP einem das Berechnen des Tages netterweise ab

. Mehr zu Ostern unter
Das Datum des Osterfestes.
Hier eine kleine Tabelle, wie sich einige Feiertage berechnen, die restlichen Feiertage sind fast alle an festen Daten,
wie z.B. Weihnachten, Silvester und Allerheiligen.
| Feiertagsname | Anzahl der Tage um Ostern |
| Rosenmontag | -48 Tage |
| Karfreitag | -2 Tage |
| Ostersamstag | -1 Tag |
| Ostermontag | +1 Tag |
| Christi Himmelfahrt | +39 Tage |
| Pfingstsamstag | +48 Tage |
| Pfingstsonntag | +49 Tage |
| Pfingstmontag | +50 Tage |
| Fronleichnam | +60 Tage |
Das Datum des Osterfestes
Das hier habe ich beim stöbern gefunden:
Seit der Rückkehr der Juden aus dem babylonischen Exil wird der Tag des Osterfestes (Pesach, Pascha) aufgrund des ersten Vollmondes nach dem Frühlingsanfang (21. März) berechnet. Die Christen übernahmen diese Regelung für ihr Osterfest.
Der deutsche Mathematiker Carl Friedrich Gauß (1777-1855) konnte für jedes Jahr nach der Gregorianischen Kalenderreform (1582), 1583-8201, den Oster-Termin berechnen. Allerdings ist es noch offen, ob 3200 oder 3600 zum Ausgleich einer Restzeit das Schaltjahr ausfallen muss.
In der Wikipedia gibt es auch einen recht großen Abschnitt über Ostern und die verschiedenen Kalendertypen sowie
die unterschiedlichen Berechnungen
Wikipedia - Osterdatum
Wer nicht den ganzen Text durchlesen möchte - obwohl es recht interessant ist - der findet in der Wikipedia einen Link zu
den Calendar FAQ von
Claus Tondering. Dort gibt es
nicht nur über Ostern ein paar Hintergrundinformationen, sondern eine recht komplexe Erläuterung zu den verschiedenen
Kalendersystemen sowie Berechnungen.
Die Osterformeln
Wie ich die ganzen Berechnungen sowie Formeln für Excel, php und so weiter durchgeschaut hatte, habe ich mich für den Ursprung der
Osterformeln interessiert und bin fündig geworden. Da sie doch recht komplex sind, habe ich mir gedacht, eine kleine Tabelle zu schreiben, damit man mal die einzelnen Rechenschritte nachvollziehen kann.
| Allgemeine Osterformel |
| Formel | Wert |
| C = Jahr / 100 |
20 |
| G = Jahr mod 19 |
17 |
| H = (C - C/4 - (8*C+13)/25 + 19*G + 15) mod 30 |
17 |
| I = H - (H/28)*(1 - (29/(H + 1))*((21 - G)/11)) |
17 |
| J = (Jahr + Jahr/4 + I + 2 - C + C/4) mod 7 |
6 |
| L = I - J |
11 |
| Ostermonat = 3 + (L + 40)/44 |
4 |
| Ostertag = L + 28 - 31*(Ostermonat/4) |
8 |
|
| Osterformeln für 1900-2099 |
| Formel | Wert |
| C = Jahr / 100 |
entfällt |
| G = Jahr mod 19 |
entfällt |
| H = (24 + 19*(Jahr mod 19)) mod 30 |
17 |
| I = H - H / 28 |
17 |
| J = (Jahr + Jahr/4 + I - 13) mod 7 |
6 |
| L = I - J |
11 |
| Ostermonat = 3 + (L + 40)/44 |
4 |
| Ostertag = L + 28 - 31*(Ostermonat/4) |
8 |
|
| PHP Funktion easter_date() ergibt: 07.04.2012 |
Als kleines Anhängsel noch ein paar kurze Erläuterungen zu dem ganzen Formelgewirr.
- G ist die Goldene Nummer-1: Geht von 1-19 und steht mit Mondphasen und den Tagen des Jahres in Zusammenhang, die sich alle 19 Jahre wiederholen
- H ist der 23-Epact (modulo 30): hat was mit dem 'Alter' des Neumondes zu tun
- I ist die Anzahl der Tage vom 21. März bis zum Oster-Vollmond
- J ist die Nummer des Wochentages (Sonntag=0, Montag=1,...)
- L ist die Anzahl der Tage vom 21. März bis zum Sonntag des oder vor dem Oster-Vollmond (Zahl zwischen -6 und 28)
Für weitere, noch genauere Erläuterungen einfach mal beim
Claus Tondering vorbeischauen - ist allerdings
auf englisch...
Die PHP Funktion easter_date() hat leider einige Einschränkungen:
- sie kann nur für die Jahre zwischen 1970-2037 angewendet werden,
- sie gibts nun halt mal nur in PHP (für andere Programmiersprachen muß man sich mal umschauen), und
- lustigerweise liefert sie ein falsches Ergebnis für die Jahre 1971-1974 - zumindest in XAMPP mit Standard -
Konfiguration

Zum Spaß habe ich hier mal das Datum inklusive des Tagnamens vom Oster
sonntag
2012 hingeschrieben (und zwar mit
strftime('%A den %d. %B 1971',easter_date($Jahr)):
Samstag den 07. April 2012 - Beim Online-Test war alles OK, schade! Hatte
mich schon so gefreut!
Wenn man sich die Tabelle genauer betrachtet, dann sollte auffallen, daß nirgendwo Nachkommastellen
auftreten. In der Beschreibung von
Claus Tondering
steht geschrieben:
(Again, the divisions are integer divisions, in which remainders are
discarded.). Für mich bedeutet das, daß alle Nachkommastellen einfach abgeschnitten
werden ohne zu runden. Daher verwende ich die PHP-Funktion
floor()
und nicht
round(). Ich habe beides ausprobiert
und bin mit
floor() auf die gleichen Ergebnisse
wie
easter_date() gekommen.
Hier meine komplette Oster-Funktion in PHP:
function osterdatum($osterjahr){
$G = bcmod($osterjahr,19);
$C = floor($osterjahr / 100);
$H = bcmod($C - floor($C / 4) - floor((8 * $C + 13) / 25) + 19 * $G + 15, 30);
$I = $H - floor($H / 28) * (1 - floor(29/($H + 1)) * floor((21 - $G) / 11));
$J = bcmod($osterjahr + floor($osterjahr / 4) + $I + 2 - $C + floor($C / 4), 7);
$L = $I - $J;
$EasterMonth = 3 + floor(($L + 40) / 44);
$EasterDay = $L + 28 - 31*floor($EasterMonth / 4);
$H2 = bcmod(24 + 19*(bcmod($osterjahr, 19)), 30);
$I2 = $H2 - floor($H2 / 28);
$J2 = bcmod($osterjahr + floor($osterjahr / 4) + $I2 - 13, 7);
$L2 = $I2 - $J2;
$EasterMonth2 = 3 + floor(($L2 + 40) / 44);
$EasterDay2 = ($L2 + 28 - 31 * floor($EasterMonth2 / 4));
$osterdatum_arr = array("G" => $G, "C" => $C, "H" => $H, "I" => $I, "J" => $J, "L"
=> $L,"Ostermonat" => $EasterMonth, "Ostertag" => $EasterDay,"H2" => $H2, "I2" =>
$I2, "J2" => $J2, "L2" => $L2, "Ostermonat2" => $EasterMonth2, "Ostertag2" =>
$EasterDay2);
return $osterdatum_arr;
}
Sonnenauf- und untergang berechnen
Die Idee, warum ich hier den Sonnenauf- und untergang berechnen lasse, kommt eigentlich aus einer andere Ecke, aber ich dachte mir ich teste das mal in PHP und kann es dann später einmal in C übertragen

.
Die Quelle für meine Berechnungen ist im Skript zur Vorlesung: 'Regenerative Energien' bei Prof. Dr.-Ing. T. Hartkopf zu finden. Allgemein geht es da um die solare Energiegewinnung, bei der man zur Abschätzung der Effizienz die Dauer der Sonneneinstrahlung einbeziehen muß. Ich werde mal versuchen den ganzen Formelkram zu erklären, falls sich einer mit dem Gewirr befassen möchte um einen 'tolleren' Rechenweg zu entwickeln, obwohl dieser hier recht simpel ist. Nicht ganz so schön umgeformt habe ich die Formel auch auf der Seite
Lexikon Astronomie gefunden. Allerdings benutzen die dort Java Script, und das mag ich ja nicht

.
Als erstes gelte, daß die Erde nicht auf einer eliptischen Bahn verläuft, sondern auf einer Kreisbahn (seltsamer Weise werden die Rechnungen dadurch einfacher). Ferner dreht sich die Erde um ihre Achse, die zum Vektor Sonne-Erde um 23,45° geneigt ist. Die Achse selber führe mal keine Nutation aus. (Ohne Abbildung wirds etwas schwierig, aber das liefere ich irgendwann nach!) Eigentlich könnte man an dieser Stelle den ganzen Winter-, Frühling-, Sommer- und Winteranfangskram erklären, aber das überspringe ich mal. Daführ müßte man sich mal die ganzen Winkel zwischen Sonne und Erde anschauen. Für die Sonnenauf- und untergänge ist das erstemal zweitrangig. Die sogenannte Deklination δ beschreibt den Winkel zwischen Himmelsäquator und Sonne und ist definiert als:
sin δ = sin Ψ sin δ0
Dabei ist Ψ der Winkel von der 0-Position der Erde am 21. März zur derzeitigen Position auf der Umlaufbahn um die Sonne. Er berechnet sich durch mehr oder weniger abzählen der Tage mit:
Ψ = 360° × (Tageszahl - 81)/365
Die Tageszahl kann einfach gezählt werden, nach meiner Einschätzung gibt es aber einen kleinen Fehler bei Schaltjahren durch das feste Setzen des 21. März auf Tageszahl 81 (Offset) und Anzahl der Tage im Jahr auf 365. Über PHP könnte man das aber auch sehr leicht auf das jeweilige Jahr anpassen. Da allerdings schon einige Vereinfachungen gemacht worden sind, erzielt diese Anpassung wohl kaum eine nennenswert höhere Genauigkeit. δ
0 ist hierbei der Winkel der Erdachse in Bezug auf den Vektor Sonne-Erde mit δ
0 = 23,45°. Mal wieder aufgrund der gegebenen Winkel kann vereinfacht
δ = sin δ0 sin Ψ
geschrieben werden, so daß sich letztlich
δ = 23,45° sin (360° × (Tageszahl - 81)/365)
ergibt.
Neben der Deklination ist nur noch der sogenannte Stundenwinkel ω notwendig, der den aktuellen Stand der Sonne im Verlauf des Tages angibt. Dabei ist um 12Uhr Mittags ω = 0, definiert damit den Zeitpunkt des höchsten Sonnenstandes und für kann nach
ω = 360° ( (T-12h)/24h )
berechnet werden.
Für einen beliebigen Punkt auf der Erdoberfläche kann ein Vektor zum Sonnenstand aufgestellt werden. Ohne genaue Herleitung sind der so aus (δ ist der Breitengrad):
s = [cosδ cosω sinφ - sinδ cosφ , cosδ sinω , cosδ cosω cosφ + sinδ sinφ ]
Jetzt wirds etwas schwammig weil ein paar Winkel nicht im Originalbild eingetragen sind, und ich muß das Ganze nochmal genauer nachforschen

...
Für die weitere Berechnung wird nur die z-Komponente benötigt und 0 gesetzt:
sz = 0 = cosδ cosω0 cosφ + sinδ sinφ
-> cosω0 = - tanδ tanφ
-> ω0 = arccos (- tanδ tanφ)
Für den Sonnenauf- und untergang ergibt sich abschließend durch Umformung der obigen Formel ω=...:
T auf = 12h - ω0/15
T auf = 12h + ω0/15
In PHP ergeben sich ein paar Probleme mit der Berechnung von z.B. 3,61 Stunden. Ich habe es mit der Funktion
floor() gelöst. Zusätzlich rechnet PHP in RAD daher die Umrechnungen. Am Schluß werden die Stunden und Minuten <10 mit einer vorangestellten '0' versehen und das Ergebnis ausgegeben. Das schaut dann so aus:
// Ziffern <10 eine 0 voranstellen
function addZero($zahl){
if ($zahl < 10 and $zahl >= 0){
return "0$zahl";
}
elseif ($zahl > -10 and $zahl < 0){
return "-0" . abs($zahl);
}
else {
return $zahl;
}
}
// --- Sonnenauf- und untergang berechnen --- //
function sonnenstand($sonnendatum, $breitengrad){
$dez2rad = 2 * pi() / 360;
$tagimJahr = strftime("%j",$sonnendatum);
$delta = 23.45 * sin(360 * ($tagimJahr - 81) * $dez2rad / 365);
$w_0 = acos(-tan($delta* $dez2rad) * tan($breitengrad* $dez2rad))/$dez2rad;
$T_auf = 12 - ($w_0 / 15)+ date("I",$sonnendatum);
$T_auf_min = ($T_auf - floor($T_auf))*60;
$T_unter = 12 + ($w_0 / 15)+ date("I",$sonnendatum);
$T_unter_min = ($T_unter - floor($T_unter))*60;
$sonnenstand_arr["Sonnenaufgang_std"] = addZero(floor($T_auf));
$sonnenstand_arr["Sonnenaufgang_min"] = addZero(floor($T_auf_min));
$sonnenstand_arr["Sonnenuntergang_std"] = addZero(floor($T_unter));
$sonnenstand_arr["Sonnenuntergang_min"] = addZero(floor($T_unter_min));
return $sonnenstand_arr;
}
Anregungen, Korrekturen oder Meckereien können gerne in meinem Gästebuch oder im Forum hinterlassen werden.