Kategorie: Blog::Web-Entwicklung::PHP
erstellt am 10.06.2008 um 11:15h
Berechnung von Feiertagen
Es gibt immer wieder Applikationen für die man die Feiertage des Jahres benötigt.Nun kann man mühselig alle Feiertage der nächsten 5 Jahre in eine DB oder eine Datei hinterlegen. Meistens vergisst man dann diese Applikation und in 5 Jahren läuft dann nichts mehr.
Viel besser ist es also die Feiertage zu berechnen.Hier folgt nun eine kleine Funktion, die die variablen Feiertage des Jahres ausrechnet.
Einziger Input für die Funktion ist das Jahr, für die man die Feiertage erhalten möchte.
Die Funktion bedient sich einer Formel um den Ostersonntag zu berechnen. Mehr dazu kann man in den Quellen nachlesen.
Vom Ostersonntag aus kann man dann mit folgender Liste alle anderen Feiertage bestimmen:
- Aschermittwoch = Ostersonntag - 46
- Karfreitag = Ostersonntag - 2
- Ostermontag = Ostersonntag + 1
- Christi Himmelfahrt = Ostersonntag + 39
- Pfingstsonntag = Ostersonntag + 49
- Pfingstmontag = Ostersonntag + 50
- Fronleichnam = Ostersonntag + 60
<?php
/**
* @Author: Cord-Heinrich Pahlmann (E-Mail s. Impressum/Kontakt)
* @Copyright: 2008 by Cord-Heinrich Pahlmann
* @License: Distributed under the Lesser General Public License (LGPL)
* http://www.gnu.org/copyleft/lesser.html
* Info: http://www.pahlmann.biz/blog/web_entwicklung/php/feiertage_berechnung
*/
/**
* Berechnet die Feiertage des angegebenen Jahres und gibt ein Array mit diesen zurück
* @param string $jahr - Jahr für welches die Feiertage gesucht werden sollen
* @return array $datums_array - Mehrdimensionales Array mit den Feiertage
*/
function berechne_feiertag($jahr)
{
$H = floor(fmod((24 + 19*(floor(fmod($jahr, 19)))), 30));
$I = floor($H - floor($H/28));
$J = floor(fmod(($jahr + floor($jahr/4) + $I - 13), 7));
$L = $I - $J;
//Definition des Monats und des Tages vom Oster-Sonntag
$monat = floor(3 + floor(($L + 40)/44));
$tag = floor($L + 28 - 31 * floor($monat/4));
//Definition des Timestamps vom Oster-Sonntag um 00:00:01h
$timestamp = mktime(0,0,1,$monat, $tag, $jahr);
$datums_array['ostersonntag'] = array("tag"=>$tag, "monat"=>$monat, "jahr"=>$jahr);
$temp = $timestamp + 60 * 60 * 24;
$datums_array['ostermontag'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp - 60 * 60 * 24 * 46;
$datums_array['aschermittwoch'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp - 60 * 60 * 24 * 2;
$datums_array['karfreitag'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp + 60 * 60 * 24 * 39;
$datums_array['christi_himmelfahrt'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp + 60 * 60 * 24 * 49;
$datums_array['pfingstsonntag'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp + 60 * 60 * 24 * 50;
$datums_array['pfingmontag'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
$temp = $timestamp + 60 * 60 * 24 * 60;
$datums_array['fronleichnam'] = array("tag"=>date("j", $temp), "monat"=>date("n", $temp), "jahr"=>date("Y", $temp));
return $datums_array;
}
?>
Download der PHP-Datei: berechnung_feiertage.zip
Quellen:
- http://www.tondering.dk/claus/cal/node3.html
- http://www.vienna.cc/d/artikel/excel_kalender_feiertage.htm
Kommentare
am 17.07.2008 um 22:36h von Tim erstellt
Hi,
könntest Du das Ganze vielleicht nochmal übersichtlicher gestalten?
Vielleicht in eine Funktion oder Klasse packen?
am 18.07.2008 um 21:37h von chp erstellt
Hi Tim,
kann ich machen. Mal gucken ob ich das bis Ende nächster Woche hinkriege...
am 30.07.2008 um 13:43h von chp erstellt
Hi Tim,
hab es jetzt endlich geschafft alles in eine Funktion zu packen.
Ich glaube es fehlen noch ein paar Feiertage. Werde die bei Gelegenheit mal nachziehen. Dann packe ich wahrscheinlich alle festen Feiertage auch mit rein.
Außerdem könnte man sicherlich gleich im Funktionsaufruf den gewünschten Feiertag und bei Bedarf das Datums-Format auswählen. Komm sicher auch noch....
am 01.08.2008 um 09:23h von Tim erstellt
Jawoll, so sieht das schon wesentlich besser aus...
Die E-Mail-Funktion ist übrigens sehr cool. Hätte den Beitrag sicherlich aus den Augen verloren. Wenn ich dann mal wieder was zum Thema gesucht hätte, hätte ich diesen Beitrag sicherlich nicht gefunden.
Neuer Kommentar
E-Mail Benachrichtigung
Sie können hier Ihre E-Mail Adresse hinterlegen, bei jeder Änderung oder bei einem neuen Kommentar erhalten Sie eine kurze E-Mail.Ihre E-Mail Adresse wird nur in Verbindung mit diesem Beitrag in unserer Datenbank gespeichert. Sie wird nicht zu Werbezwecken benutzt, an Dritte weitergegeben oder an irgendeiner Stelle veröffentlicht.
