Calcolo giorni lavorativi

- Pubblicato in coding di - Permalink

enter image description here

Calcola il primo giorno lavorativo utile dopo una data di scadenza, considerando weekend, festività nazionali italiane, Santi Patroni e festività locali.

<?php
function getPayDay($dateCheck, $extraDates = []): string
{
    $date = DateTime::createFromFormat('Y-m-d', $dateCheck);
    if (!$date) return "Errore: Formato data non valido (usa Y-m-d)";

    $year = $date->format('Y');

    $daysToEaster = easter_days($year);
    $easter = new DateTime("$year-03-21");
    $easter->modify("+$daysToEaster days");
    $mondayEaster = (clone $easter)->modify('+1 day');

    $holidays = [
        '01-01',
        '01-06',
        '04-25',
        '05-01',
        '06-02',
        '08-15',
        '11-01',
        '12-08',
        '12-25',
        '12-26',
        $easter->format('m-d'),
        $mondayEaster->format('m-d')
    ];

    if ($year >= 2026) {
        $holidays[] = '10-04';
    }

    $extra = array_filter(
        array_unique($extraDates),
        fn(string $d): bool => (bool) preg_match('/^\d{2}-\d{2}$/', $d)
    );

    $holidays = array_unique(array_merge($holidays, array_values($extra)));

    while (in_array($date->format('w'), [0, 6]) || in_array($date->format('m-d'), $holidays)) {
        $date->modify('+1 day');
    }

    if (class_exists('IntlDateFormatter')) {
        $fmt = new IntlDateFormatter('it_IT', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
        $formattedDate = ucfirst($fmt->format($date));
    } else {
        $formattedDate = $date->format('d/m/Y');
    }

    return "Data utile: " . $formattedDate;
}

$extraDates  = ["08-24","08-25","08-26"];

echo getPayDay("2026-08-24", $extraDates);
Etichette:
→