Beim Einbinden von Ferengis Terminverwaltung für den Designer in meine V2-IPS ist mir aufgefallen, das es die ToniTools (bisher) nicht für V2 gibt. Also musste ich eine andere Lösung für das Thema Feiertage finden. Als Ergebnis habe ich die folgenden PHP-Funktionen geschrieben (bzw. zusammenkopiert :D), die ich hiermit allen interessierten zur Verfügung stellen möchte:
Das gesamte Konstrukt besteht aus 2 Hilfs-, einer Berechnungs- und 2 Auswertefunktionen:
Zunächst die Berechnungsfunktion:
// Errechnet das Datum des Ostersonntags für ein gegebenes Jahr
function easter($year) {
if($year > 2038 || $year < 1970) {
return false;
} else {
$a = $year % 19;
$b = $year % 4;
$c = $year % 7;
$m = ((8 * ($year / 100) + 13) / 25) - 2;
$s = ($year / 100) - ($year / 400) - 2;
$M = (15 + $s - $m) % 30;
$N = (6 + $s) % 7;
$d = ($M + 19 * $a) % 30;
if ($d == 29) {
$D = 28;
} elseif ($d == 28 && $a >= 11) {
$D = 27;
} else {
$D = $d;
}
$e = (2 * $b + 4 * $c + 6 * $D + $N) % 7;
$delta = $D + $e + 1;
$easter = gmmktime(0, 0, 0, 3, 21, $year) + $delta * (24 * 3600);
return $easter;
}
}
Diese Funktion (ist glaube ich die Berechnung des Ostersonntags nach Gauss) hab ich mir kopiert in in php umkodiert…
Dann noch die 2 Hilfsfunktionen, welche von den beiden Auswertefunktion benötigt werden:
// Beseitigt Stundenanteile in einem UNIX-Zeitstempel
function ResetHours(&$timestamp) {
$hour = date('G', $timestamp);
$timestamp -= ($hour * 3600);
}
function ResetHour($timestamp) {
$hour = date('G', $timestamp);
$timestamp -= ($hour * 3600);
return $timestamp;
}
Die erste Funktion ist eine sog. „Callback“-Funktion (wird von array_walk in der Auswertefunktion Feiertage aufgerufen) um für alle Elemente eines Arrays die Stundenanteile der Zeitstempel zu entfernen.
Die zweite Funktion ist fast identisch, lediglich der erste Parameter wird dabei nicht als Referenz übergeben sondern das Ergebnis als Returnwert geliefert.
Jetzt noch die erste Auswertefunktion, „Feiertage“. Sie liefert ein Array mit allen Feiertagen des angegebenen Jahres zurück. Es ist ein assoziatives Array, die Feiertagsnamen stellen die Schlüssel dar, der Wert ist jeweils ein entsprechender UNIX-Zeitstempel:
// Berechnet alle festen und variablen Feiertage eines gegebenen Jahrs.
// Die Feiertage werden als Array zurückgeliefert, wobei der Key dem
// Feiertagsnamen entspricht und der Wert dem entsprechenden Zeitstempel.
function Feiertage($year) {
$OneDay = 24 * 60 * 60;
$easter = easter($year);
if(!$easter) {
return false;
} else {
$advday = date('w', gmmktime(0, 0, 0, 11, 26, $year));
$advent = gmmktime(0, 0, 0, 11, 26, $year) + (($advday == 0 ? 0 : 7 - $advday) * $OneDay);
$holidays['Neujahr'] = gmmktime(0, 0, 0, 1, 1, $year);
$holidays['Heilige Drei Könige'] = gmmktime(0, 0, 0, 1, 6, $year);
$holidays['Rosenmontag'] = $easter - (48 * $OneDay);
$holidays['Fastnacht'] = $easter - (47 * $OneDay);
$holidays['Aschermittwoch'] = $easter - (46 * $OneDay);
$holidays['Karfreitag'] = $easter - (2 * $OneDay);
$holidays['Ostersonntag'] = $easter;
$holidays['Ostermontag'] = $easter + (1 * $OneDay);
$holidays['Tag der Arbeit'] = gmmktime(0, 0, 0, 5, 1, $year);
$holidays['Christi Himmelfahrt'] = $easter + (39 * $OneDay);
$holidays['Pfingstsonntag'] = $easter + (49 * $OneDay);
$holidays['Pfingstmontag'] = $easter + (50 * $OneDay);
$holidays['Fronleichnam'] = $easter + (60 * $OneDay);
$holidays['Mariä Himmelfahrt'] = gmmktime(0, 0, 0, 8, 15, $year);
$holidays['Tag der deutschen Einheit'] = gmmktime(0, 0, 0, 10, 3, $year);
$holidays['Reformationstag'] = gmmktime(0, 0, 0, 10, 31, $year);
$holidays['Allerheiligen'] = gmmktime(0, 0, 0, 11, 1, $year);
$holidays['Buß- und Bettag'] = $advent - (11 * $OneDay);
$holidays['1. Advent'] = $advent;
$holidays['2. Advent'] = $advent + (7 * $OneDay);
$holidays['3. Advent'] = $advent + (14 * $OneDay);
$holidays['4. Advent'] = $advent + (21 * $OneDay);
$holidays['Heiligabend'] = gmmktime(0, 0, 0, 12, 24, $year);
$holidays['1. Weihnachtsfeiertag'] = gmmktime(0, 0, 0, 12, 25, $year);
$holidays['2. weihnachtsfeiertag'] = gmmktime(0, 0, 0, 12, 26, $year);
$holidays['Silvester'] = gmmktime(0, 0, 0, 12, 31, $year);
array_walk($holidays, 'ResetHours');
return $holidays;
}
}
Die letzte Funktion habe ich aus Platzgründen im nächsten Beitrag untergebracht.