Skip to content

Instantly share code, notes, and snippets.

@jcvasquez07
Created September 9, 2023 22:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcvasquez07/69bdcbcd2fbe96db4d32c98d85de875e to your computer and use it in GitHub Desktop.
Save jcvasquez07/69bdcbcd2fbe96db4d32c98d85de875e to your computer and use it in GitHub Desktop.
Determinación de las fechas de Semana Santa
<?php
/**
* Determina la fecha del jueves y viernes santo para el año en curso usando el
* Algoritmo de Butcher, del «Almanaque Eclesiástico» de 1876, válido a partir de 1582
* Ref: https://blog.cardila.com/2007/04/02/como-calcular-la-fecha-de-la-semana-santa/
*
* @return Array
*/
function semana_santa($año = null) {
if($año == null) {
$año = date('Y');
}
$a = $año % 19;
$b = intdiv($año, 100);
$c = $año % 100;
$d = intdiv($b, 4);
$e = $b % 4;
$f = intdiv(($b + 8), 25);
$g = intdiv(($b - $f + 1), 3);
$h = (19 * $a + $b - $d - $g + 15) % 30;
$i = intdiv($c, 4);
$k = $c % 4;
$l = (32 + 2 * $e + 2 * $i - $h - $k) % 7;
$m = intdiv(($a + 11 * $h + 22 * $l), 451);
$n = $h + $l - 7 * $m + 114;
// Estos dos valores son numéricos
$mes = intdiv($n, 31);
$dia = 1 + ($n % 31);
// Formato: AAAA-MM-DD
$domingo_resurreccion = $año . "-" . str_pad($mes, 2, '0', STR_PAD_LEFT) . "-" . str_pad($dia, 2, '0', STR_PAD_LEFT);
// Determinamos las fechas del jueves, viernes y domingo (formato DD-MM-AAAA)
$domingo = date($domingo_resurreccion);
$jueves_santo = date("d-m-Y", strtotime('-3 day', strtotime($domingo)));
$viernes_santo = date("d-m-Y", strtotime('-2 day', strtotime($domingo)));
$domingo_santo = date("d-m-Y", strtotime($domingo));
return [$jueves_santo, $viernes_santo, $domingo_santo];
}
// EJEMPLOS DE USO
// Este año
echo '<p>Jueves Santo año actual<br>';
echo semana_santa()[0] . "<br>";
echo '<p>Viernes Santo año actual <br>';
echo semana_santa()[1] . "<br>";
echo '<p>Domingo de Resurrección (Butcher) año actual <br>';
echo semana_santa()[2] . "<br><br>";
// Año 2015
$año = 2015;
echo '<p>Jueves Santo ' . $año . '<br>';
echo semana_santa($año)[0] . "<br>";
echo '<p>Viernes Santo ' . $año . '<br>';
echo semana_santa($año)[1] . "<br>";
echo '<p>Domingo de Resurrección (Butcher) ' . $año . '<br>';
echo semana_santa($año)[2] . "<br>";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment