-
Notifications
You must be signed in to change notification settings - Fork 15
Description
Bezugnehmend auf den Kommentar cccc5d4#commitcomment-4841687
Für SEPA Transaktionen gilt der TARGET Kalender (Trans-European Automated Realtime Gross Settlement Express Transfer System). Er bestimmt die einheitlichen Bankarbeitstage im SEPA Raum.
Arbeitsfreie Tage nach TARGET sind lediglich:
- die Wochenenden
- Neujahr
- Karfreitag
- Ostermontag
-
- Mai
-
- Weihnachtsfeiertag
-
- Weihnachtsfeiertag
Bis auf die zwei variablen Osterfeiertage sind alle anderen zu einem festen Datum/Termin. Und selbst für die Osterfeiertage hat PHP ja mittlerweile eine eigene Funktion.
Deshalb hier zwei Funktionen, die denke ich recht nützlich sind.
Man übergibt der naechsterArbeitstag Funktion das Fälligkeitsdatum und erhält automatisch den nächsten Arbeitstag zurückgeliefert. Ich hab mal nicht nur die offiziellen TARGET Tage als Feiertag eingetragen, sondern auch die deutschen Feiertage mit dazu genommen.
(Beispiel: naechsterArbeitstag("2013-12-25") würde dann "2013-12-27" als Ergebnis liefern.)
function naechsterArbeitstag($datum, $format = "Y-m-d")
{
$startTime = strtotime($datum);
$d = 0;
$sd = "";
do
{
$jahr = date('Y', strtotime('+' . $d . ' day', $startTime));
$monat = date('m', strtotime('+' . $d . ' day', $startTime));
$tag = date('d', strtotime('+' . $d . ' day', $startTime));
$b = pruefeFeiertag($tag, $monat, $jahr);
$sd = date($format, strtotime('+' . $d . ' day', $startTime));
++$d;
} while ($b);
return $sd;
}
function pruefeFeiertag($tag, $monat, $jahr)
{
// Parameter in richtiges Format bringen
if (strlen($tag) == 1)
{
$tag = "0$tag";
}
if (strlen($monat) == 1)
{
$monat = "0$monat";
}
// Wochentag berechnen
$datum = getdate(mktime(0, 0, 0, $monat, $tag, $jahr));
$wochentag = $datum['wday'];
// Prüfen, ob Wochenende
if ($wochentag == 0 || $wochentag == 6)
{
return true;
}
// Feste Feiertage werden nach dem Schema ddmm eingetragen
$feiertage[] = "0101"; // Neujahrstag
$feiertage[] = "0105"; // Tag der Arbeit
$feiertage[] = "0310"; // Tag der Deutschen Einheit
$feiertage[] = "2512"; // Erster Weihnachtsfeiertag
$feiertage[] = "2612"; // Zweiter Weihnachtsfeiertag
// Bewegliche Feiertage ermitteln
$ostersonntag = easter_days($jahr);
$datum = new DateTime("$jahr-03-21");
$ostermontag = $ostersonntag + 1;
$ostermontag = $datum->add(new DateInterval("P{$ostermontag}D"));
$feiertage[] = $ostermontag->format('dm');
$datum = new DateTime("$jahr-03-21");
$karfreitag = $ostersonntag - 2;
$karfreitag = $datum->add(new DateInterval("P{$karfreitag}D"));
$feiertage[] = $karfreitag->format('dm');
$datum = new DateTime("$jahr-03-21");
$himmelfahrt = $ostersonntag + 39;
$himmelfahrt = $datum->add(new DateInterval("P{$himmelfahrt}D"));
$feiertage[] = $himmelfahrt->format('dm');
$datum = new DateTime("$jahr-03-21");
$pfingstmontag = $ostersonntag + 50;
$pfingstmontag = $datum->add(new DateInterval("P{$pfingstmontag}D"));
$feiertage[] = $pfingstmontag->format('dm');
// Prüfen, ob Feiertag
$code = $tag . $monat;
if (in_array($code, $feiertage))
{
return true;
}
else
{
return false;
}
}