Calcolo giorni lavorativi

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);
→