Comunidad de diseño web y desarrollo en internet

Computus, cálculo de la semana santa con Javascript

Computus, es el cálculo de la fecha de Pascua. A veces dentro de algún proyecto, necesitas incluir un control de fechas y como parte de este a veces y solo a veces es necesario el calculo de feriados y dentro de estos, está la Pascua, más conocida como Semana Santa, dado que el resto de feriados son particulares a cada posición geográfica, pero la Semana Santa es universal, nos avocaremos al calculo de esta, para calcular la fecha de Pascua.

Para este efecto tendremos en cuenta los lineamientos que estableció Dionisio el Exiguo (525d.C.) par el calculo de esta fecha:

Wikipedia :

  • Que la Pascua se celebrase en domingo.
  • Este domingo ha de ser el siguiente al plenilunio pascual (la primera luna llena de la primavera boreal). Si esta fecha cayese en domingo, la Pascua se trasladará al domingo siguiente para evitar la coincidencia con la Pascua judía.
  • La luna pascual es aquella cuyo plenilunio tiene lugar en el equinoccio de primavera (vernal) del hemisferio norte (de otoño en el sur) o inmediatamente después.
  • Este equinoccio tiene lugar el 21 de marzo.
  • Llamamos epacta a la edad lunar. En concreto nos interesa para este cálculo la época del año, la diferencia en días que el año solar excede al año lunar. O dicho más fácilmente, el día del ciclo lunar en que está la Luna el 1 de enero del año cuya Pascua estamos calculando. Este número —como es lógico— varía entre 0 y 29.
Antes de proseguir es preciso dejar claro que en términos astronómicos, el equinoccio puede tener lugar el 20 o el 19 de marzo, si bien en el calendario gregoriano se establecen unas fechas astronómicas que, aún difiriendo ligeramente de las fechas astronómicas reales, son las que se emplean para el cálculo.

Así las cosas, queda claro que la Pascua de Resurrección no puede ser antes del 22 de marzo (en caso de que el 21 y plenilunio fuese sábado), y tampoco puede ser más tarde del 25 de abril, (suponiendo que el 21 de marzo fuese el día siguiente al plenilunio, habría que esperar una lunación completa (29 días) para llegar al siguiente plenilunio, que sería el 18 de abril, el cual, si cayese en domingo, desplazaría la Pascua una semana para evitar la coincidencia con la pascua judía, quedando: 18 + 7 el 25 de abril)
Todo este rollo fue desmenuzado y entendido por el matemático Gauss encontró una formula sencilla de calcular esta fecha y facilitarnos la vida al resto de simples mortales, la formula dice así:

Definamos 5 variables, a, b, c, d, y e. Además de dos constantes M y N, que para los años comprendidos entre 1900 y 2100 tomarán los valores 24 y 5 respectivamente. Llamaremos A al año del que queremos calcular la Pascua.

Donde :
  • a es el resto de la división A entre 19
  • b es el resto de la división A entre 4
  • c es el resto de la división A entre 7
  • d es el resto de la división de 19 veces "a" mas la constante M entre 30
  • e es el resto de la división 2 veces "b" mas 4 veces "c" mas 6 veces "d" mas N entre 7

Si "d" mas "e" era menor que 10 entonces la Pascua caerá en el día ("d" más "e" más 22) de marzo. En caso contrario, que "d" más "e" sea mayor que 9, la Pascua caerá en el día ("d" más "e" menos 9) de abril.

Existiendo únicamente 02 excepciones a esta regla:

Si la fecha obtenida es el 26 de abril, entonces la Pascua caerá en el 19 de abril.
Si la fecha obtenida es el 25 de abril, con "d" igual a 28, "e" igual a 6 y "a" mayor que 10, entonces la Pascua caerá en el 18 de abril.

Si quisiéramos calcular la fecha de pascua fuera de los años 1900 a 2100 las constantes a usar serian:

Años > M > N
1583-1699 > 22 > 2
1700-1799 > 23 > 3
1800-1899 > 23 > 4
1900-2099 > 24 > 5
2100-2199 > 24 > 6
2200-2299 > 25 > 0

Para todos los que hallan leído alguna de mis anteriores publicaciones ya se habrán dado cuenta que todo esto es el algoritmo en bruto de como calcular la dichosa fecha en base a esto podrán pasarlo a cualquier lenguaje de programación, no me pidan que les ponga le pq de cada cantidad pq entonces no acabo nunca, en fin ahora pasaremos todo esto a nuestra estimado Javascript, obteniendo lo siguiente:

Código :

function pascua($annio) {
 if      ($annio>1583 && annio<1699) { $M=22; $N=2; } 
 else if ($annio>1700 && annio<1799) { $M=23; $N=3; } 
 else if ($annio>1800 && annio<1899) { $M=23; $N=4; } 
 else if ($annio>1900 && annio<2099) { $M=24; $N=5; } 
 else if ($annio>2100 && annio<2199) { $M=24; $N=6; } 
 else if ($annio>2200 && annio<2299) { $M=25; $N=0; } 
 $a = $anio % 19;
 $b = $anio % 4;
 $c = $anio % 7;
 $d = ((19*$a) + $M) % 30;
 $e = ((2*$b) + (4*$c) + (6*$d) + $N) % 7;
 $f = $d + $e;
 if ($f < 10) { 
  $dia = $f + 22;
  $mes = 3;
 } else  {
  $dia = $f - 9;
  $mes = 4;
 };
 if ($dia == 26 && $mes == 4){ 
  $dia = 19;
 };
 if ($dia == 25 && $mes == 4 && $d == 28 && $e == 6 && $a > 10){
  $dia = 18;
 };
 $pascua = new Date($anio,$mes,$dia);
 return $pascua;
}; 

Habiendo obtenido ya la fecha del domingo pascua podemos pasar a obtener su marca de tiempo y de esta manera al restarle los milisegundo correspondientes a 6 días obtener cuando cae el lunes de la misma semana y asi obtener el rango completo de semana santa, esto es:

Código :

function lunes_pascua($pascua){
 $time = $pascua.getTime();
 $dias = 6*24*60*60*1000 //recuerda que en javascript se expresa en milisegundos
 $lunes = $time-$dias;
 $lunes = new Date($lunes);
 return $lunes;
}

y con eso ya tienen el lunes y el domingo de pascua, úsenlo a conveniencia y discreción, cualquier error favor de comunicar, pero adelante que es culpa de cualquiera menos mia xD°

Diccionario:
plenilunio pascual: La primera luna llena de la primavera boreal.
equinoccio: Momento del año en que los días tienen una duración igual a la de las noches en todos los lugares de la Tierra.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate