Programación

PHP

Funciones para obtener fechas de semana santa por año

Última actualización: 15-09-2024 14:35
Clase cl_holyWeek con funciones para obtener: Importante:

Código

<?php
    // :: Funciones comunes para otras clases ::
    class cl_common {
        // Devuelve HTML de legibilidad facilitada de un arreglo
        function showArray($ar) {
            return '<pre style="padding:10px; background-color:#ccc;">' . print_r($ar, true) . '</pre>';
        }
    }
 
    // :: Cálculo de fechas de semana santa a partir de la función easter_days de PHP ::
    class cl_holyWeek extends cl_common {
 
        // Devuelve la fecha del "Domingo de Resurrección" del año solicitado
        function getLastDateOfYear($year = 0) {
            if ($year == 0) $year = date('Y');
            $easterDays = easter_days($year);
            $dt =  new DateTime(date('Y-m-d', strtotime($year . '-03-21')));
            $dt->add(new DateInterval('P' . $easterDays . 'D'));
            return $dt->format('Y-m-d');
        }
 
        // Devuelve arreglo con fechas de la semana santa del año solicitado
        function getDatesOfYear($year = 0) {
            if ($year == 0) $year = date('Y');
            $r = NULL;
            $diff1Day = new DateInterval('P1D');
            $diff1Day->invert = 1;
 
            $easterDays = easter_days($year);
 
            $dt =  new DateTime(date('Y-m-d', strtotime($year . '-03-21')));
            $dt->add(new DateInterval('P' . $easterDays . 'D'));
 
            $r =  array($dt->format('Y-m-d'));
            for ($i = 1; $i <= 3; $i++) {
                $dt->add($diff1Day);
                $r[] = $dt->format('Y-m-d');
            }
 
            return array_reverse($r);
        }
 
        // Devuelve arreglo con fechas de la semana santa del año solicitado agrupando por año
        function getDatesOfYearLikeGroup($year = 0) {
            $tmp = $this->getDatesOfYear($year);
            $starterYear = intval(substr($tmp[0], 0, 4));
            $r[$starterYear] = $tmp;
            return $r;
        }
 
        // Devuelve arreglo con fechas de la semana santa del rango de años solicitado
        function getDatesOfYears($starterYear = 0, $endingYear = 0) {
            $r = $this->getDatesOfYear($starterYear);
 
            $endingYear = ($endingYear <= 0 ? $starterYear : $endingYear);
 
            for ($i = $starterYear + 1; $i <= $endingYear; $i++)
                $r = array_merge($r, $this->getDatesOfYear($i));
 
            return $r;
        }
 
        // Devuelve arreglo con fechas de la semana santa del rango de años solicitado en grupos por año
        function getDateGroupsOfYears($starterYear = 0, $endingYear = 0) {
            if ($starterYear == 0) $starterYear = date('Y');
 
            $r = null;
 
            for ($i = $starterYear; $i <= $endingYear; $i++)
                $r[$i] = $this->getDatesOfYear($i);
 
            return $r;
        }
 
        // Devuelve el HTML de una tabla con el  listado de fechas por año del rango que se solicite
        function getHTMLResult($starterYear = 0, $endingYear = 0) {
            $r = '';
            $ar = $this->getDateGroupsOfYears($starterYear, $endingYear);
 
            $theadAndYearTD_Style = ' style="background-color: black; color:white;"';
            $oddRow = '';
            $evenRow = ' style="background-color:#eaeaea;"';
 
            $tID = 'tResultHolidayDates-' . md5(rand(1, 1000));
 
            $r .= '<style>'
                    . '#' . $tID . ' tbody tr:hover { background-color:#363636!important; color:white!important; }'
                    . '.tr-current-year { color:#006600; background-color:#7d7!important; font-weight:bold; }'
                    . '#' . $tID . ' .tr-current-year:hover { color:#007!important; background-color:#FC0!important;  }'
                . '</style>';
            $r .= '<table'
                        . ' id="' . $tID
                        . '" name="' . $tID . '"'
                        . ' style="width:100%; font-family:Verdana; text-align: center; border-collapse: collapse;"'
                        . ' cellpadding="10" border="1"'
                    . '>'
                        . '<thead' . $theadAndYearTD_Style . '>'
                            . '<tr>'
                                . '<th>Año</th>'
                                . '<th>Jueves Santo</th>'
                                . '<th>Viernes Santo</th>'
                                . '<th>Sábado de Gloria</th>'
                                . '<th>Domingo de Resurrección</th>'
                            . '</tr>'
                        . '</thead>'
                        . '<tbody>';
                            $nrow = 0;
                            $currentYear = intval(date('Y'));
                            foreach ($ar as $year => $arDate) {
                                $nrow++;
                                $r .= '<tr'
                                            . ($year == $currentYear ? ' class="tr-current-year" title="Este es el año en curso actualmente"' : '')
                                            . ($nrow % 2 == 0 ? $evenRow : $oddRow)
                                        . '>';
                                    $r .= '<td' . $theadAndYearTD_Style . '>' . $year . '</td>';
                                    foreach ($arDate as $idx => $xdate) $r .= '<td>' . $xdate . '</td>';
                                $r .= '</tr>';
                            }
                        $r .=  '</tbody>'
                    . '</table>';
 
            return $r;
        }
 
    }
 
    // Declaración de instancia de cl_holyWeek
    $o = new cl_holyWeek();
 
    // Definición de parámetros de año de inicio y año final del rango de consulta
    $currentYear = intval(date('Y'));
    $startYear = $currentYear - 2;
    $endYear = $currentYear + 2;
 
    $sTitleStyle = ' style="background-color:#069; color:#FFF; padding:4px;"';
    $xc = '';
    if (true) $xc .= '<div ' . $sTitleStyle . '>Función [getLastDateOfYear] :: Muestra fecha del Domingo de Resurrección del año en curso</div>'
                    . '<div style="padding: 10px; background-color:#ccc;">' . $o->getLastDateOfYear() . '</div>'
                    . '<hr/>';
 
    if (true) $xc .= '<div ' . $sTitleStyle . '>' . 'Función [getDatesOfYear] :: Devuelve arreglo con fechas de la semana santa del año solicitado' . '</div>'
                    . $o->showArray($o->getDatesOfYear()) . '<hr/>';
 
    if (true) $xc .= '<div ' . $sTitleStyle . '>' . 'Función [getDatesOfYearLikeGroup] :: Devuelve arreglo con fechas de la semana santa del año solicitado agrupando por año' . '</div>'
                    . $o->showArray($o->getDatesOfYearLikeGroup()) . '<hr/>';
 
    if (true) $xc .= '<div ' . $sTitleStyle . '>' . 'Función [getDatesOfYears] :: Devuelve arreglo con fechas de la semana santa del rango de años solicitado' . '</div>'
                    . $o->showArray($o->getDatesOfYears($startYear, $endYear)) . '<hr/>';
 
    if (true) $xc .= '<div ' . $sTitleStyle . '>' . 'Función [getDateGroupsOfYears] :: Devuelve arreglo con fechas de la semana santa del rango de años solicitado en grupos por año' . '</div>'
                    . $o->showArray($o->getDateGroupsOfYears($startYear, $endYear)) . '<hr/>';
 
    // Definición de parámetros de año de inicio y año final del rango de consulta
    $startYear = 1979;
    $endYear = 2040;
    if (true) $xc .= '<div ' . $sTitleStyle . '>' . 'Función [getHTMLResult] :: Devuelve el HTML de una tabla con el  listado de fechas por año del rango que se solicite' . '</div>'
                    . '<br/>'
                    . $o->getHTMLResult($startYear, $endYear);
 
    echo $xc;
?>

Resultado

Función [getLastDateOfYear] :: Muestra fecha del Domingo de Resurrección del año en curso
2024-03-31

Función [getDatesOfYear] :: Devuelve arreglo con fechas de la semana santa del año solicitado
Array
(
    [0] => 2024-03-28
    [1] => 2024-03-29
    [2] => 2024-03-30
    [3] => 2024-03-31
)

Función [getDatesOfYearLikeGroup] :: Devuelve arreglo con fechas de la semana santa del año solicitado agrupando por año
Array
(
    [2024] => Array
        (
            [0] => 2024-03-28
            [1] => 2024-03-29
            [2] => 2024-03-30
            [3] => 2024-03-31
        )

)

Función [getDatesOfYears] :: Devuelve arreglo con fechas de la semana santa del rango de años solicitado
Array
(
    [0] => 2022-04-14
    [1] => 2022-04-15
    [2] => 2022-04-16
    [3] => 2022-04-17
    [4] => 2023-04-06
    [5] => 2023-04-07
    [6] => 2023-04-08
    [7] => 2023-04-09
    [8] => 2024-03-28
    [9] => 2024-03-29
    [10] => 2024-03-30
    [11] => 2024-03-31
    [12] => 2025-04-17
    [13] => 2025-04-18
    [14] => 2025-04-19
    [15] => 2025-04-20
    [16] => 2026-04-02
    [17] => 2026-04-03
    [18] => 2026-04-04
    [19] => 2026-04-05
)

Función [getDateGroupsOfYears] :: Devuelve arreglo con fechas de la semana santa del rango de años solicitado en grupos por año
Array
(
    [2022] => Array
        (
            [0] => 2022-04-14
            [1] => 2022-04-15
            [2] => 2022-04-16
            [3] => 2022-04-17
        )

    [2023] => Array
        (
            [0] => 2023-04-06
            [1] => 2023-04-07
            [2] => 2023-04-08
            [3] => 2023-04-09
        )

    [2024] => Array
        (
            [0] => 2024-03-28
            [1] => 2024-03-29
            [2] => 2024-03-30
            [3] => 2024-03-31
        )

    [2025] => Array
        (
            [0] => 2025-04-17
            [1] => 2025-04-18
            [2] => 2025-04-19
            [3] => 2025-04-20
        )

    [2026] => Array
        (
            [0] => 2026-04-02
            [1] => 2026-04-03
            [2] => 2026-04-04
            [3] => 2026-04-05
        )

)

Función [getHTMLResult] :: Devuelve el HTML de una tabla con el listado de fechas por año del rango que se solicite

AñoJueves SantoViernes SantoSábado de GloriaDomingo de Resurrección
19791979-04-121979-04-131979-04-141979-04-15
19801980-04-031980-04-041980-04-051980-04-06
19811981-04-161981-04-171981-04-181981-04-19
19821982-04-081982-04-091982-04-101982-04-11
19831983-03-311983-04-011983-04-021983-04-03
19841984-04-191984-04-201984-04-211984-04-22
19851985-04-041985-04-051985-04-061985-04-07
19861986-03-271986-03-281986-03-291986-03-30
19871987-04-161987-04-171987-04-181987-04-19
19881988-03-311988-04-011988-04-021988-04-03
19891989-03-231989-03-241989-03-251989-03-26
19901990-04-121990-04-131990-04-141990-04-15
19911991-03-281991-03-291991-03-301991-03-31
19921992-04-161992-04-171992-04-181992-04-19
19931993-04-081993-04-091993-04-101993-04-11
19941994-03-311994-04-011994-04-021994-04-03
19951995-04-131995-04-141995-04-151995-04-16
19961996-04-041996-04-051996-04-061996-04-07
19971997-03-271997-03-281997-03-291997-03-30
19981998-04-091998-04-101998-04-111998-04-12
19991999-04-011999-04-021999-04-031999-04-04
20002000-04-202000-04-212000-04-222000-04-23
20012001-04-122001-04-132001-04-142001-04-15
20022002-03-282002-03-292002-03-302002-03-31
20032003-04-172003-04-182003-04-192003-04-20
20042004-04-082004-04-092004-04-102004-04-11
20052005-03-242005-03-252005-03-262005-03-27
20062006-04-132006-04-142006-04-152006-04-16
20072007-04-052007-04-062007-04-072007-04-08
20082008-03-202008-03-212008-03-222008-03-23
20092009-04-092009-04-102009-04-112009-04-12
20102010-04-012010-04-022010-04-032010-04-04
20112011-04-212011-04-222011-04-232011-04-24
20122012-04-052012-04-062012-04-072012-04-08
20132013-03-282013-03-292013-03-302013-03-31
20142014-04-172014-04-182014-04-192014-04-20
20152015-04-022015-04-032015-04-042015-04-05
20162016-03-242016-03-252016-03-262016-03-27
20172017-04-132017-04-142017-04-152017-04-16
20182018-03-292018-03-302018-03-312018-04-01
20192019-04-182019-04-192019-04-202019-04-21
20202020-04-092020-04-102020-04-112020-04-12
20212021-04-012021-04-022021-04-032021-04-04
20222022-04-142022-04-152022-04-162022-04-17
20232023-04-062023-04-072023-04-082023-04-09
20242024-03-282024-03-292024-03-302024-03-31
20252025-04-172025-04-182025-04-192025-04-20
20262026-04-022026-04-032026-04-042026-04-05
20272027-03-252027-03-262027-03-272027-03-28
20282028-04-132028-04-142028-04-152028-04-16
20292029-03-292029-03-302029-03-312029-04-01
20302030-04-182030-04-192030-04-202030-04-21
20312031-04-102031-04-112031-04-122031-04-13
20322032-03-252032-03-262032-03-272032-03-28
20332033-04-142033-04-152033-04-162033-04-17
20342034-04-062034-04-072034-04-082034-04-09
20352035-03-222035-03-232035-03-242035-03-25
20362036-04-102036-04-112036-04-122036-04-13
20372037-04-022037-04-032037-04-042037-04-05
20382038-04-222038-04-232038-04-242038-04-25
20392039-04-072039-04-082039-04-092039-04-10
20402040-03-292040-03-302040-03-312040-04-01