Tweety's Cage www.Birdyshome.de
19. September 2017
 
Tweety
 

Infos zu den Feiertagen
Das Datum des Osterfestes
Die Osterformeln
Sonnenauf- und untergang berechnen
Tag Monat Jahr

Heute ist Dienstag der 19. September 2017

Der ausgewählte Tag war/ist Dienstag der 19. September 2017.
Sonnenaufgang am Dienstag den 19. September 2017 ist um: 05:57 Uhr, Sonnenuntergang um: 18:02 Uhr.

Danke an Jan für den Hinweis auf Sommerzeit!


August 2017
WocheMo DiMiDoFr SaSo
31  123456
32 78910111213
33 14151617181920
34 21222324252627
35 28293031  
September 2017
WocheMo DiMiDoFr SaSo
35     123
36 45678910
37 11121314151617
38 18 19 2021222324
39 252627282930
Oktober 2017
WocheMo DiMiDoFr SaSo
39       1
40 2345678
41 9101112131415
42 16171819202122
43 23242526272829
44 3031    
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

Zurück nach oben...



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

Zurück nach oben...



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

Zurück nach oben...



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.
Jahr für die Oster-Berechnung auswählen:

Allgemeine Osterformel
FormelWert
C = Jahr / 100 20
G = Jahr mod 19 3
H = (C - C/4 - (8*C+13)/25 + 19*G + 15) mod 30 21
I = H - (H/28)*(1 - (29/(H + 1))*((21 - G)/11)) 21
J = (Jahr + Jahr/4 + I + 2 - C + C/4) mod 7 2
L = I - J 19
Ostermonat = 3 + (L + 40)/44 4
Ostertag = L + 28 - 31*(Ostermonat/4) 16
Osterformeln für 1900-2099
FormelWert
C = Jahr / 100 entfällt
G = Jahr mod 19 entfällt
H = (24 + 19*(Jahr mod 19)) mod 30 21
I = H - H / 28 21
J = (Jahr + Jahr/4 + I - 13) mod 7 2
L = I - J 19
Ostermonat = 3 + (L + 40)/44 4
Ostertag = L + 28 - 31*(Ostermonat/4) 16
PHP Funktion easter_date() ergibt: 16.04.2017
Als kleines Anhängsel noch ein paar kurze Erläuterungen zu dem ganzen Formelgewirr. 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:
  1. sie kann nur für die Jahre zwischen 1970-2037 angewendet werden,
  2. sie gibts nun halt mal nur in PHP (für andere Programmiersprachen muß man sich mal umschauen), und
  3. lustigerweise liefert sie ein falsches Ergebnis für die Jahre 1971-1974 - zumindest in XAMPP mit Standard - Konfiguration :D
Zum Spaß habe ich hier mal das Datum inklusive des Tagnamens vom Ostersonntag 2017 hingeschrieben (und zwar mit strftime('%A den %d. %B 1971',easter_date($Jahr)): Sonntag den 16. April 2017 - Beim Online-Test war alles OK, schade! Hatte mich schon so gefreut! :q

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

Zurück nach oben...



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 :P.
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.