Skip to content

Prüfung auf Feiertage (inkl. Code) #3

@Heart1010

Description

@Heart1010

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
    1. Mai
    1. Weihnachtsfeiertag
    1. 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;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions