====== Ermittlung der bundesweit gesetzlichen Feiertage ======
===== Feste Feiertage =====
Diese Feiertage fallen im gesamten Bundesland jedes Jahr auf das selbe Datum:
* 01.01. Neujahrstag
* 01.05. Tag der Arbeit
* 03.10. Tag der Deutschen Einheit
* 25.12. Erster Weihnachtsfeiertag
* 26.12. zweiter Weihnachtsfeiertag
===== Bewegliche Feiertage =====
Alle beweglichen Feiertage, mit Ausnahme vom [[buss_und_bettag|Buß- und Bettag]], können auf Grundlage des Ostersonntags berechnet werden.
Für Ostersonntag gilt:
* Ostersonntag ist der Sonntag nach dem ersten Vollmond ab Frühlingsbeginn, also ab dem 21. März
* Der durchschnittliche Abstand zwischen zwei Vollmonden beträgt 29 Tage, zwölf Stunden und vierundvierzig Minuten.
* Somit liegt der frühestmögliche Termin für Ostersonntag beim 22. März und der späteste beim 25. April
^gesetzlicher Feiertag ^ Zeitpunkt ^Bundesländer^
| Karfreitag | Ostersonntag - 2 Tage | alle |
| Ostersonntag | Ostersonntag | nur Brandenburg |
| Ostermontag | Ostersonntag + 1 Tag | alle |
| Christi Himmelfahrt | Ostersonntag + 39 Tage | alle |
| Pfingstsonntag | Ostersonntag + 49 Tage | alle |
| Pfingstmontag | Ostersonntag + 50 Tage | alle |
| Fronleichnam | Ostersonntag + 60 Tage | nur SL, RP, NW, BY, BW und TH |
| [[buss_und_bettag|Buß- und Bettag]] | 11 Tage vor dem 1. Advent | nur Sachsen |
----
===== Ostersonntag mit der PHP-Funktion "easter_date" herausfinden =====
Die PHP-Funktion easter_date( $year ) gibt den Unix-Timestamp (Anzahl der Sekunden seit dem 01.01.1970) vom Ostersonntag um 0:00 Uhr vom als Parameter übergebendem Jahr zurück. Einschränkung: Es können nur Jahreszahlen von 1970 bis 2037 übergeben werden.
**Wichtiger technischer Hinweis:** Die Funktion "easter_date" ist eine Funktion aus der Erweiterung "calendar". Wenn PHP auf einem Windows Betriebssystem ausgeführt wird sind die Kalenderfunktionen bereits automatisch enthalten. Auf Linux-Systemen hingegen muss PHP mit der Erweiterung '--enable-calendar' kompiliert werden. Andernfalls wird ein Fatal Error ('Call to undefined function') geworfen.
----
===== Codebeispiel =====
In diesem Codebeispiel werden ausschließlich bundesweite Feiertage berücksichtigt. Bei Bedarf können, je nach Bundesland, die entsprechenden Feiertage ergänzt werden.
class calendar
{
protected $holidays = array();
protected $year = 0;
/**
* calendar constructor.
* @param int|string $year
*/
public function __construct( $year = 0 )
{
$this->year = ( $year == 0 ) ? date( 'Y' ) : $year;
// feste Feiertage definieren
$this->holidays[] = '01.01.'; // Neujahr
$this->holidays[] = '01.05.'; // Tag der Arbeit
$this->holidays[] = '03.10.'; // Tag der Deutschen Einheit
$this->holidays[] = '25.12.'; // 1. Weihnachtsfeiertag
$this->holidays[] = '26.12.'; // 2. Weihnachtsfeiertag
// alle beweglichen Feiertage von Karfreitag bis Pfinstmontag
$easterSunday = date( 'd.M.Y', easter_date( $this->year ) );
foreach( array( -2, 1, 39, 49, 50 ) as $day )
{
$time = array( $easterSunday, $day, 'day');
$ts = strtotime( implode( ' ', $time ) );
$this->holidays[] = date( 'd.m.', $ts );
}
}
/**
* @param int $timestamp
* @return bool
*/
public function isHoliday( $timestamp )
{
$date = date( 'd.m.', $timestamp );
return in_array( $date, $this->holidays );
}
}
===== Anwendungsbeispiel: =====
$cal = new calendar( 2016 );
$days = ( date( 'L' ) ) ? 366 : 365; // Schaltjahr: 366 Tage, sonst 365 Tage
for( $day = 0; $day < $days; $day++ ) // jeden Tag des Jahres anzeigen
{
$time = array( '01.01.' . date( 'Y' ), $day, 'day' );
$timestamp = strtotime( implode( ' ', $time ) );
if( $cal->isHoliday( $timestamp ) ) // wenn der Tag ein Feiertag ist
{
echo "Der " . date( 'd.m.Y.', $timestamp ) . " ein Feiertag!
";
}
else // wenn der Tag KEIN Feiertag ist
{
echo "Der " . date( 'd.m.Y.', $timestamp ) . " ist kein Feiertag
";
}
}