¿Quién no se ha preguntado alguna vez, en sus tiempos de ocio, en que día de la semana nació tal persona o incluso uno mismo?
Todos hemos recurrido a los famosos ‘calendarios perpetuos’ que encontrábamos en nuestras agendas con sus famosas tablas cuantificadas por meses y años y que nos permitía saciar nuestra curiosidad.
En la era de las computadoras y en pleno siglo XXI se hace necesario implementar algoritmos eficientes y sencillos de programar en cualquier lenguaje a base de sencillas operaciones del procesador.
Desarrollaremos a continuación un sencillo algoritmo basado en contar días a partir de un origen y ubicar el punto de la semana en que nos encontramos.
Siete son los días que hay en la semana
empieza con lunes
y en domingo acaba
martes y miércoles
ya juntos cabalgan,
el jueves nos dice:
¡mitad de semana!
viernes y sábado
alegres exclaman:
¡con nosotros llega
el fin de semana!
El procedimiento que seguiremos para obtener el número de días transcurridos hasta nuestra fecha e incluirlos en nuestra formula ‘día de la semana’ será el siguiente:
- Establecer una fecha origen o de referencia para iniciar nuestros cálculos.
- Enumerar los días de la semana comenzando por el cero hasta el seis, de esta forma podemos emplear aritmética módulo 7 para añadir el número de días transcurridos desde el comienzo de un periodo.
- Desarrollo de la fórmula basándonos en la observación de que el día de la semana progresa de una manera predecible con cada subparte de la fecha elegida (día, mes y año). Cada término de la fórmula se usa para calcular el desplazamiento necesario para obtener el día correcto de la semana con respecto a cada una de esas subpartes..
- Cálcular el efecto que producen en nuestra fecha de referencia los días de la fecha elegida para calcular el día de la semana.
- Cálcular el efecto que producen en nuestra fecha de referencia los meses de la fecha elegida para calcular el día de la semana.
- Cálcular el efecto que producen en nuestra fecha de referencia los años de la fecha elegida para calcular el día de la semana.
- Probar la formula desarrollada con fechas y días de la semana conocidos.
- Jugar con la formula.
De esta manera nuestra formula quedará de la siguiente forma:
.
Dónde será un número entero entre 0-6 que nos determinará en que día de la semana cae la fecha que hemos elegido.
será el número de días transcurridos desde la fecha elegida hasta nuestra fecha de referencia.
la descompondremos en
para diferenciar el efecto producido por la adición de los días, los meses y los años.
será la operación que nos indicará cuantos días hay que añadir a nuestra semana después de eliminar las semanas enteras que hay en los días transcurridos
.
1. Establecer una fecha origen o de referencia.
Dado que ni todos los meses ni todos los años tienen el mismo número de días es conveniente que en los años bisiestos el día se añada al final del año para minimizar el efecto de los cambios en el número de días anuales en nuestros cálculos.
Así pues, tomaremos como el primer día del año el 1 de marzo de forma que la numeración de los meses pasará a ser: Marzo = 1, Abril = 2, Mayo = 3, Junio = 4, Julio = 5, Agosto = 6, Septiembre = 7, Octubre = 8, Noviembre = 9, Diciembre = 10, Enero = 11, Febrero = 12. Hay que hacer notar que con esta nueva numeración de los meses cuando deseemos calcular el día de la semana de un mes de enero o de febrero, a parte de asignarles su nueva numeración, hay que restar un año a la fecha elegida para que los cálculos sean congruentes.
2. Enumerar los días de la semana comenzando por el cero hasta el seis, de esta forma podemos emplear aritmética módulo 7 para añadir el número de días transcurridos desde el comienzo de un periodo.
Notar que comenzamos a numerar desde 0, no desde 1, para que los cálculos sean coherentes con los restos de la división del número de días que hay que añadir a nuestra fecha de referencia entre el número de días de la semana (7).
3 A. Cálcular el efecto que producen en nuestra fecha de referencia los días (dd) de la fecha elegida para calcular el día de la semana.
Dado que cada día sucesivo a nuestra fecha de referencia resulta en un desplazamiento adicional de 1 en el día de la semana tan sólo debemos de sumar el número de días (dd) de la fecha elegida a nuestra fecha de referencia, quedando:
.
3 B. Cálcular el efecto que producen en nuestra fecha de referencia los años de la fecha elegida para calcular el día de la semana.
Primero calcularemos el efecto de los años normales y luego lo completaremos con los años bisiestos.
Los años normales tienen 365 días. O lo que es lo mismo, 52 semanas completas más un día. Lo que quiere decir que por cada año normal debemos de sumar un día:
Como hay 366 días en cada año bisiesto, esto de debe tener en cuenta añadiendo un día adicional al valor de desplazamiento del día de la semana. El número de años bisiestos se calcula como . Usando una lógica similar, se puede calcular la progresión del día de la semana para cada centuria observando que los años divisibles por 100 no son bisiestos excepto si también lo son por 400. El resultado sería añadir los términos
para descontar los bisiestos divisibles por 100 y
para sumar los bisiestos divisibles por 400. Añadiendo estos términos a la formula:
3 C. Cálcular el efecto que producen en nuestra fecha de referencia los meses de la fecha elegida para calcular el día de la semana.
En la siguiente tabla mostramos los incrementos en días que produce cada mes tanto en días totales como descontando las semanas enteras:
Mar. Abr. May. Jun. Jul. Ago. Sep. Oct. Nov. Dic. Ene. Feb.
31 30 31 30 31 31 30 31 30 31 31 28
00 31 61 92 122 153 184 214 245 275 306 337
03 02 03 02 03 03 02 03 02 03 03 0
00 03 05 08 10 13 16 18 21 23 26 29 29
Observese que los primeros 5 meses dan un incremento de 13 días al igual que los siguientes 5 meses luego nuestra formula de incrementos debe ser algo similar a:
En términos de incremento sobre los días de la semana o
en términos de días absolutos.
Sumando todos los términos nuestra formula queda de la siguiente manera:
.
ó
.
4. Probar la formula desarrollada con fechas y días de la semana conocidos.
Obtengamos el valor de la formula para una fecha conocida (día de la semana conocido) y con ese valor enumeraremos los días de la semana.
Por ejemplo, para el 11 de Junio de 2011 (Sábado) nuestra formula nos da un valor de 6; por tanto, si el sábado = 6 el resto de los días de la semana quedará como sigue:
Domingo = 0, Lunes = 1, Martes = 2, Miércoles = 3, Jueves = 4, Viernes = 5, Sábado = 6.
En el caso de usar la fórmula de días absolutos totales para el 11 de Junio de 2011 (Sábado) el resultado obtenido será de 4. Podemos enumerar los días de la semana acorde a este resultado o simplemnete añadir la contante 2 a nuestra formula para mantener una numeración común para ambas fórmulas.
5. Jugar con la formula.
Ustedes mismos.
Referencias:
- La congruencia de Zeller es un algoritmo ideado por Julius Christian Johannes Zeller para calcular el día de la semana de cualquier fecha del calendario.
- Diferentes formas de calcular el día de la semana, Calendario Perpetuo.
Curiosidades:
- Además de calcular el día de la semana de un día concreto, podemos calcular en que fecha caerá un día determinado de la semana de un mes concreto. Por ejemplo: ¿En que fecha caerá el último domingo del mes de Junio? Tan sólo debemos de calcular que día de la semana será el último día del mes y restarlo al número total del días del mes. El 30 de Junio de 2011, según nuestra formula, caerá en Jueves (valor=4); si restamos 4 a los 30 días del mes veremos que el 26 de Junio de 2011 será el domingo que andamos buscando.
- Análogamente podemos calcular en que fecha caerá el primer sábado del mes de Julio. Según nuestra formula el primer día del mes de Julio será viernes (valor =5); añadiendo la diferencia que nos queda hasta el sábado(valor=6) vemos que el primer sábado caerá el dos de Julio de 2011.
- El día 1 de enero del año 1 fue ….. Lunes. Se ve que empezamos el calendario trabajando.
- Obsérvese que para dos fechas dadas
y
si usamos la fórmula de días absolutos antes de calcular el
podemos hallar la diferencia de días entre las dos fechas simplemente restando S(
) de S(
).
¡¡¡Como te gusta complicarnos con tantas operaciones!!!
Es todo un placer que alguien se tome la molestia de comentar en mi blog.
He creado una sección llamada ‘Sugerencias’ en la que serán bienvenidas todas las aportaciones que quieras realizar. Te espero allí.
Muchas gracias por tu cometario.