Feiertage mit php ermitteln

Erstellt am 27. September 2007
  in
 
1439
vote

Manchmal möchte man überprüfen, ob ein bestimmtes Datum ein Feiertag, Arbeitstag oder Wochenende ist. Dafür habe ich jetzt eine kleine php Funktion geschrieben:

Demo für 2008

Das php Script:

Ist natürlich beliebig erweiterbar. Die Variable $bundesland ist optional, um die Feiertage von einem Bundesland zu ermitteln. Macht manchmal auch Sinn.


<?php
error_reporting
(E_ALL);
header("Content-Type: text/html; charset=UTF-8");

/**
 * Ermittle Feiertage, Arbeitstage und Wochenenden von einem Datum
 *
 * @param string $datum im Format YYYY-MM-DD
 * @param string $bundesland
 * @return string
 */
function feiertag ($datum,$bundesland='') {

    
$datum explode("-"$datum);

    
$datum[1] = str_pad($datum[1], 2"0"STR_PAD_LEFT);
    
$datum[2] = str_pad($datum[2], 2"0"STR_PAD_LEFT);

    if (!
checkdate($datum[1], $datum[2], $datum[0])) return false;

    
$datum_arr getdate(mktime(0,0,0,$datum[1],$datum[2],$datum[0]));

    
$easter_d date("d"easter_date($datum[0]));
    
$easter_m date("m"easter_date($datum[0]));

    
$status 'Arbeitstag';
    if (
$datum_arr['wday'] == || $datum_arr['wday'] == 6$status 'Wochenende';

    if (
$datum[1].$datum[2] == '0101') {
        return 
'Neujahr';
    } elseif (
$datum[1].$datum[2] == '0106') {
        return 
'Heilige Drei Könige';
    } elseif (
$datum[1].$datum[2] == '0319' && ($bundesland == 'k' || $bundesland == 'st' || $bundesland == 't' || $bundesland == 'v')) {
        return 
'Josef';
    } elseif (
$datum[1].$datum[2] == $easter_m.$easter_d) {
        return 
'Ostersonntag';
    } elseif (
$datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+1,$datum[0]))) {
        return 
'Ostermontag';
    } elseif (
$datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+39,$datum[0]))) {
        return 
'Christi Himmelfahrt';
    } elseif (
$datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+49,$datum[0]))) {
        return 
'Pfingstsonntag';
    } elseif (
$datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+50,$datum[0]))) {
        return 
'Pfingstmontag';
    } elseif (
$datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+60,$datum[0]))) {
        return 
'Fronleichnam';
    } elseif (
$datum[1].$datum[2] == '0501') {
        return 
'Erster Mai';
    } elseif (
$datum[1].$datum[2] == '0504' && $bundesland == 'ooe') {
        return 
'Florian';
    } elseif (
$datum[1].$datum[2] == '0815') {
        return 
'Mariä Himmelfahrt';
    } elseif (
$datum[1].$datum[2] == '0924' && $bundesland == 's') {
        return 
'Rupertitag';
    } elseif (
$datum[1].$datum[2] == '1010' && $bundesland == 'k') {
        return 
'Tag der Volksabstimmung';
    } elseif (
$datum[1].$datum[2] == '1026') {
        return 
'Nationalfeiertag';
    } elseif (
$datum[1].$datum[2] == '1101') {
        return 
'Allerheiligen';
    } elseif (
$datum[1].$datum[2] == '1111' && $bundesland == 'b') {
        return 
'Martini';
    } elseif (
$datum[1].$datum[2] == '1115' && ($bundesland == 'noe' || $bundesland == 'w')) {
        return 
'Leopoldi';
    } elseif (
$datum[1].$datum[2] == '1208') {
        return 
'Mariä Empfängnis';
    } elseif (
$datum[1].$datum[2] == '1224') {
        return 
'Heiliger Abend';
    } elseif (
$datum[1].$datum[2] == '1225') {
        return 
'Christtag';
    } elseif (
$datum[1].$datum[2] == '1226') {
        return 
'Stefanitag';
    } else {
        return 
$status;
    }

}

for (
$monat 1$monat <= 12$monat++) {

    echo 
'<strong>'.$monat.'</strong><br>';

    for (
$tag 1$tag <= 31$tag++) {

        
$tmp feiertag('2008-'.$monat.'-'.$tag,'noe');

        if (
$tmp == 'Arbeitstag' || $tmp == 'Wochenende') {
            echo 
$tag.'.'.$monat.': '.$tmp.'<br>';
        } else {
            echo 
$tag.'.'.$monat.': <strong>'.$tmp.'</strong><br>';
        }

    }

    echo 
'<br><br>';

}

?>

Kommentare

wollt einfach nur danke

wollt einfach nur danke sagen...
mit dieser funktion hast du mir sehr viel arbeit erspart :-)

wow, super sache! thx

wow, super sache! thx

Hallo, wie muss man das

Hallo, wie muss man das Bundesland eintragen, ich finde zwar gibt es da ein bestimmten Code? Kann mir echt nicht vorstellen wie ich da eintragen soll, da ja nicht mal eine Stelle dafür vorgesehen ist.

Das Beispiel gibt die

Das Beispiel gibt die jeweiligen Landesfeiertage der österreichischen Bundesländer zurück. zB diese Zeile:

} elseif ($datum[1].$datum[2] == '0319' && ($bundesland == 'k' || $bundesland == 'st' || $bundesland == 't' || $bundesland == 'v')) {

War für mich insofern wichtig, weil am Landesfeiertag auch frei ist; Eine Globale Lösung ist der Code nicht;

Ganz große Klasse. Die

Ganz große Klasse. Die Bundesländer beziehen sich offenbar nur auf Österreich. Oder?

Ja genau. War damals für

Ja genau. War damals für einen Kunden aus Österreich wichtig.

Echt n1 dass du es

Echt n1 dass du es veröffentlicht hast, THX!!!

Leider noch etwas

Leider noch etwas unflexibel, aber der Ansatz ist nett und lässt sich weiterverarbeiten. Danke!

Ich wollte mich auch

Ich wollte mich auch anschließen - Danke!

Ich habe das ganze Ding erweitert um eine Arrayausgabe :
- Name des Tages
- Feiertag (1/0)
- Gesetzl. geschlossen (1/0)
- Vortag stärker frequentiert (1/0)

-- Deutsche Feiertage! (NRW) --
Wer Fehler findet darf sie behalten :-)

[php]function feiertag ($datum,$bundesland='') {

$datum = explode("-", $datum);

$datum[1] = str_pad($datum[1], 2, "0", STR_PAD_LEFT);
$datum[2] = str_pad($datum[2], 2, "0", STR_PAD_LEFT);

if (!checkdate($datum[1], $datum[2], $datum[0])) return false;

$datum_arr = getdate(mktime(0,0,0,$datum[1],$datum[2],$datum[0]));

$easter_d = date("d", easter_date($datum[0]));
$easter_m = date("m", easter_date($datum[0]));

$status = 'Arbeitstag';
if ($datum_arr['wday'] == 0 || $datum_arr['wday'] == 6) $status = 'Wochenende';

/*
Syntax bei Rückgabe : ,,,
*/

if ($datum[1].$datum[2] == '0101') {
return array('Neujahr',1,1,1);
} elseif ($datum[1].$datum[2] == '0106') {
return array('Heilige 3 Koenige',0,0,0);
} elseif ($datum[1].$datum[2] == '0501') {
return array('Maifeiertag',1,0,1);
} elseif ($datum[1].$datum[2] == '0214') {
return array('Valentinstag',0,0,1);
} elseif ($datum[1].$datum[2] == '0307') {
return array('Tag der gesunden Ernährung',0,0,0);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d-3,$datum[0]))) {
return array('Altweiber',0,0,1);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d-2,$datum[0]))) {
return array('Karfreitag',0,0,0);
} elseif ($datum[1].$datum[2] == $easter_m.$easter_d) {
return array('Ostersonntag',1,1,1);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+1,$datum[0]))) {
return array('Ostermontag',1,0,1);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+39,$datum[0]))) {
return array('Christi Himmelfahrt',1,1,0);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+49,$datum[0]))) {
return array('Pfingstsonntag',1,1,1);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+50,$datum[0]))) {
return array('Pfingstmontag',1,0,0);
} elseif ($datum[1].$datum[2] == date("md",mktime(0,0,0,$easter_m,$easter_d+60,$datum[0]))) {
return array('Fronleichnam',0,0,0);

} elseif ($datum[1].$datum[2] == date('d.m.Y',strtotime('second sunday',mktime(0,0,0,5,0,${year} ) ) ) ) {
return array('Muttertag',1,0,1);

} elseif ($datum[1].$datum[2] == '0815') {
return array('Himmelfahrt',0,0,0);
} elseif ($datum[1].$datum[2] == '1003') {
return array('Tag der dt. Einheit',1,0,0);
} elseif ($datum[1].$datum[2] == '0928') {
return array('Tag des Butterbrotes',0,0,0);
} elseif ($datum[1].$datum[2] == '1206') {
return array('Nikolaus',0,0,1);
} elseif ($datum[1].$datum[2] == '1111') {
return array('Martinstag',0,0,1);
} elseif ($datum[1].$datum[2] == '1101') {
return array('Allerheiligen',0,0,0);
} elseif ($datum[1].$datum[2] == '1224') {
return array('Heiligabend',0,0,1);
} elseif ($datum[1].$datum[2] == '1225') {
return array('Erster Weihnachtstag',1,1,1);
} elseif ($datum[1].$datum[2] == '1226') {
return array('Zweiter Weihnachtstag',1,1,0);
} elseif ($datum[1].$datum[2] == '1231') {
return array('Sylvester',0,0,0);
} else {
return array(0,0,0,0);
}

}

$FeiertagsArray = feiertag($stichtag,'noe');[/php]