Vamos a ver en este post una forma para saber qué día de la semana fue cualquier fecha. El algoritmo consiste en calcular ciertos coeficientes a partir de la fecha (día, mes y año) y efectuar ciertos cálculos con ellos para quedarnos con un número entre 0 y 6. Después sabiendo qué número es el que corresponde a cada día conseguiremos resolver el problema. Vamos a explicar el método llevando a la vez un ejemplo: mi cumpleaños del año que viene, 1 de Mayo de 2007, que de antemano os digo que es martes:
1.- El siglo: El primer coeficiente que necesitamos, llamémosle A, lo conseguimos con el siglo al que pertenece el año de la fecha siguiendo esta tabla:
1700…1799 | 1800…1899 | 1900…1999 | 2000…2099 | 2100…2199 | 2200…2299 |
+5 | +3 | +1 | 0 | -2 | -4 |
En nuestro ejemplo obtenemos que A = 0
2.- Año: Tomamos los dos últimos dígitos del año en cuestión y a ese número de dos cifras le sumamos un cuarto del mismo (despreciando los decimales). Eso nos proporciona el segundo coeficiente, digamos B.
En nuestro caso: 7/4 = 1′75. Despreciamos los decimales y nos queda 1. Como los dos últimos dígitos son 07 tenemos que B = 8.
3.- Años bisiestos: Éstos son los que cumplen que sus dos últimas cifras forman un múltiplo de 4 (por ejemplo, 1992 o 2004) excepto los terminados en 00. Entre estos últimos sólo son bisiestos los múltiplos de cuatrocientos (por ejemplo 2000). Nuestro tercer coeficiente, C depende de ellos: si el año es bisiesto, y el mes es enero o febrero el coeficiente será C = –1. En cualquier otro caso C = 0.
En nuestro ejemplo, como 2007 no es bisiesto tenemos que C = 0.
4.- Mes: El cuarto coeficiente, D, nos lo da la siguiente tabla:
Enero | Feb. | Marzo | Abril | Mayo | Junio |
6 | 2 | 2 | 5 | 0 | 3 |
Julio | Agosto | Sept. | Oct. | Nov. | Dic. |
5 | 1 | 4 | 6 | 2 | 4 |
En nuestro ejemplo, como el mes es mayo, tenemos que D = 0.
5.- Día: El quinto coeficiente, E, es simplemente el día en cuestión. En este caso E = 1.
6.- Algoritmo: Tomamos todos los coeficientes calculados y los sumamos. Y después calculamos el resto módulo 7 del número que obtenemos. Eso lo podemos hacer restando 7 al resultado tantas veces como sea necesario hasta obtener un número entre 0 y 6 que llamaremos R.
En nuestro ejemplo:
A + B + C + D + E = 0 + 8 + 0 + 0 + 1 = 9
9 – 7 = 2
Por tanto R = 2
7.- Resultado: La asignación de números a cada día de la semana es la siguiente:
Lunes | Martes | Miércoles | Jueves | Viernes | Sábado | Domingo |
1 | 2 | 3 | 4 | 5 | 6 | 0 |
Por tanto, como en nuestro ejemplo R = 2 tenemos que:
el 1 de Mayo de 2007 será martes
como en realidad ocurre.
Espero que os haya parecido interesante.
Fuente: Ese Primo
¿Te ha gustado la entrada? Puedes invitarme a un café, Gauss te lo agradecerá 😉
El mes completo se puede ver, por ejemplo, aquí.
Gabriela utilizando la fórmula que se detalla en el post, y si no me he equivocado, el 7 de abril de 1972 fue viernes. Que lo haga alguien más a ver si es correcto.
fue un viernes.tiene truco, ya q cada 28 años cae el mismo dia. curratelo
Hola, me interesa saber qué dia de la semana fue el 7 de abril del 1972. O bien, tener todo el mes completo del mes de Abril de 1972. Si es que lo tienen les agradecería me lo hagan llegar.
Gracias.
Si la fecha es anterior a 15/10/1582, A = 19 – cc
El cambio de calendario se realizó en España y países catolicos el mes de octubre de 1582, que solo tuvo 20 días. Ese mes, el día siguiente al jueves 4 fué viernes 15. En el resto del mundo el cambió fué produciendose en los siguientes siglos (hasta el XX), por ejemplo en Inglaterra y colonias fué en 1752 (el dia siguiente al 3/9 fué 14/9). El nuevo calendario introdujo las reglas actuales para los años multiplo de 100 y 400. Esto solo afecta al cálculo del coeficiente “A”, que debería ser entonces: Siendo cc los 2 primeros digitos del año,… Lee más »
Vaya, buena pregunta juan23. Habría que ver cómo se realizó el cambio para adaptar el método con las modificaciones pertinentes. Supongo que no sería demasiado complicado
y las adaptaciones anteriores … cambio del calendario juliano al gregoriano?
Existe un algoritmo llamado “doomsday” para calcular el día de la semana de cualquier fecha, y que es muy similar al que muestras acá, con la gracia adicional de que está pensado para ser aprendido de memoria. En esta página:
http://rudy.ca/doomsday.html
explican el algoritmo y enseñan la forma de memorizarlo. En su momento lo aprendí, y funciona bastante bien.
Vamos a ver. Tanto algoritmo y tanto lio. Nadie ha utilizado la cabeza y ha hecho un calculo simple? Que alguien me conteste hagan el favor
Lo he hecho dani, es bastante simple. Te lo muestro para el año 2016. Primero haz de tener en cuenta estos datos. enero: 1, febrero: 4, marzo: 4, abril: 0, mayo:2, Junio:5, Julio: 0, agosto:3, septiembre: 6, octubre: 1, noviembre:4, diciembre: 6. Domingo: 1, Lunes: 2, martes:3, miercoles:4, jueves:5, viernes:6, sabado 0. Ahora bien, el año 2016 es el 6. lo que harás es muy simple, con la fecha que quieras saber, por ejemplo 28 de julio de 2016 procedes así: 28+ 0 (numero del mes)+6(numero del año)= 34 – 28( un multiplo de 7 cercano al valor que nos… Lee más »
perdona, pero 28 de julio de2016 fue JUEVES
mi nombre es Neil, nací el 29 de noviembre de 1968, ahora quiero saber qué día nací
Jueves
Naciste un día VIERNES
y no un jueves
cae l mismo dia cada 28 años
cual es el mes que cambiaria de valor si es bisiesto es enero o febrero?
febrero
ambos
El numero con el que voy a restar el total de valores calculados siempre va ser 7?
URGENTE!!!!!!!!!!!
me gustaria que ampliasen el coeficiente «A» para siglos anteriores al XVII hasta por lo menos el siglo II antes de cristo, o como se calcula, ya que no me ha quedado claro, el primer comentario de «Fede»
Los coeficientes se repiten. Como se toma una suma módulo 7, 5=-2. Entonces yendo para atrás va a ser 0, +1, +3, -2 con el año 1600, 1500, 1400 y 1300 respectivamente
Tal vez ayude un poco de código en pascal (delphi) program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.DateUtils, FMX.Dialogs; Procedure Ingresar (var A: Integer); var Valido: Boolean; begin Repeat Write (‘Ingrese el anio (1800 a 2200): ‘); ReadLn (A); Valido := (A > 1799) and (A < 2201) Until Valido; WriteLn end; Procedure Procesar (const Mes, Anio: Integer; var n, i: Integer); function Zeller (d, m, a: word): byte; { La congruencia de Zeller es un algoritmo que permite obtener, a partir de una fecha, el día de la semana que le corresponde. Se atribuye su creación a Julius… Lee más »
Los valores de las tablas, exceptuando la última que es la más clara de entender, ¿de dónde salen? ¿por qué esos números?
Hola Julio Cesar,
las tablas se basan simple y llanamente en tomar un dia conocido y hacer calores módulo 7.
A: Indica el dia de la semana del «0» de Enero del comienzo de la centuria.
B: Indica bisiestos que han pasado
C: Corrige si la fecha es anterior al 1 de Marzo de un año bisiesto el apartado B
D: Desplazamiento de cada 1 de mes respecto al origen módulo 7
E: Autoexplicativo
Juanjo Escribano, hay algo que no esta bien en tu razonamiento, sugiero lo vuelvas a razonar.
si te fijas el ultimo parámetro es el dia del mes a calcular, sigue razonándolo y cuando lo tengas todo razonado vuelve a publicar
He conseguido memorizar el proceso y funciona, pero encontre un caso muy peculiar.
Siguiendo con esta tecnica si yo quisiera saber que dia sera un 25 de Febrero de 2816, me sale Martes y en realidad sera Jueves. aqui lo puedes checar…. http://www.cuandoenelmundo.com/calendario/mexico/2816
Que me puedes comentar???
Jose, la secuencia para el valor de A debe ampliarse para fechas posteriores a 2299. Teniendo en cuenta que el -2 y el -4 son equivalentes a 5 y 3, módulo 7 quedaría así entre 1700 y 2999: +5, +3, +1, 0, +5, +3, +1, 0, +5, +3, +1, 0 y +5. (A partir de 3000, como este no será bisiesto esta secuencia varía pero es fácil de calcular). Entrando con A=0 para el intervalo 2800-2899 resulta que el 25 de febrero de 2816 resulta ser jueves. Que conste que extrapolando la secuencia restando una o dos unidades según que… Lee más »
no me cuadra la fecha jun 28 de 1969, da cero, es decir domingo y reañmente fue un sabado A 1 B 17 C 0 D 3 E 28 igual 49 modulo 7 igual cero
john, tu B es erróneo, se obtiene el correcto sumando los dos últimos dígitos (69) a su cuarta parte (17) y da 86. Con este valor sí sale sábado.
Hola, Señor: Soy un aficionado, constante en el aprendizaje por el método más rápido de saber «en qué día de la semana nació alguien» y, en menos de 30 segundos obtengo cualquier respuesta, pero estoy indagando y desearía saber, porque imagino que vd. también lo sabrá, qué método me aconsejaria para dar una respuesta tan pronto me piden una determinada fecha, como he podido ver a varios mentalista realizarlo. Si tiene a bien aconsejarme u ofreceme una fórmula, se lo agradecería de corazón, pues casi somos de la misma quinta. Tengo 69 años y he sido maestro delineante proyectista de… Lee más »
El sábado , 2 de abril del 88 y el sábado , 11 de marzo del 89.
Para los que le interese sacar el número de la semana por código php, lo pueden hacer fácilmente con el siguiente comando:
$dia = ’10’;
$mes = ‘3’;
$year = ‘2058’;
$num_semana = date(‘W’, mktime(0, 0, 0, $mes, $dia, $year));
Esto automáticamente les arrojara el número de semana en el año para la fecha que le indiquen, el resultado lo pueden comprobar desde un calendario cualquier o desde http://www.calendariodecolombia.com/
El número del año, puede ser un valor de dos o cuatro dígitos, con valores entre 0-69 mapeados a 2000-2069 y 70-100 a 1970-2000. En sistemas donde time_t es un entero con signo de 32 bits, como es lo más normal hoy en día, el rango válido para year es entre 1901 y 2038. Sin embargo, antes de PHP 5.1.0 este rango estaba limitado desde 1970 a 2038 en algunos sistemas (p.ej. Windows).
http://php.net/manual/es/function.mktime.php
llevo un buen de tiempo tratando de aserlo en js xd
deseo saber el dia de 9 de mayo del año 3000
El doomsday del año 3000 será viernes.
el 9 de mayo es un día doomsday, o sea, será viernes.
Aquí te explican el algoritmo doomsday de manera sencilla:
http://angevil.onlinewebshop.net/doomsday.php
Que complicado suena todo esto.. Solo queria que algun «cerebrito» me diga que día de la semana fue el 1 de marzo de 1948 (año bisiesto)
Espero que esta pregunta no sea muy tonta, pero igual alguien de seguro se la estará preguntando: En el coeficiente D que pasó con los demás meses? no exiten? que números se les asigna?
Por un error no se mostraba la tabla de meses completa. Ahora sí debería verse entera. Gracias por el aviso :).
INTERESANTE . ME PODRIA INDICAR SI HAY UN PROGRAMA PARA SABER LA RELACION ENTRE CALENDARIO JULIANO Y EL GREGORIANO. SE SIGUEN MANTENEIENDO LOS 7 DIAS MAS SUMADOS AL GREGORIANO DE ACUERDO AL NACIEMIENTO EN LOS PAISES ESLAVOS. GRACIAS
FELICICTACIONES
NUESTRO MAIL:
familialarssenn@gmail.com
Hey Que excelente trabajo, me sirvio mucho para realizar el programa que determina lo mismo en html5 con javascript muchas gracias ¡¡¡¡
hola quería saber si para el 10-10-1968 utilizando su método me sale que es jueves pero cuando lo controlo con el calendario es día miércoles podrias ayudarme a saber en donde me estoy equivocando
Se suman el día (10), el mes (0), el año (68), la parte entera de un cuarto del año (17) y el siglo (cero para el siglo 20). El total es 95. El residuo al dividir 95 entre 7, es 4. Corresponde al cuarto día de la semana que es Jueves.
no sirve, el ejemplo esta mal
https://www.google.com.mx/search?q=calendario+del+72&espv=2&biw=1920&bih=974&source=lnms&tbm=isch&sa=X&ved=0ahUKEwia__Svh5jQAhVCjlQKHXswC20Q_AUIBigB#tbm=isch&q=calendario+del+2007&imgrc=HKbuWx8Ztf5ZGM%3A
ese dia fue lunes
fue martes, tonto, si no sabes calcular o inglés comprueba tu respuesta antes de comentar
Correcto, y para el segundo basta aplicar Pitágoras un par de veces:
Si el radio grande mide 1, el diámetro que es el lado del cubo mide 2, luego la diagonal mide
por Pitágoras, o
. Por tanto la mitad de la diagonal es
, menos el radio que es 1, resulta que la diagonal pequeña mide
.
De nuevo por Pitágoras el lado del cubo pequeño mide
, luego el radio pequeño es
y por tanto su área es
.
Hay un fallo en el post y es que los siglos son del 01 al 100[00], no del 00 al 99 (por el simple hecho de que no existe el año 0).
Si se calcula, por ejemplo, una fecha en el 2000, el día supuesto de la semana será uno menos, es decir, si en realidad es viernes, con este error sería jueves, debido a que este año pertenece al siglo XX y no al XXI.
Hola!! He aplicado la fórmula para el 2 de febrero de 2007 y me sale miércoles. Sin embargo, ese día cayó en viernes. He intentado resolverlo con la congruencia de Zeller pero sin éxito. ¿Qué estoy haciendo mal?
Se suman el día (2), el mes (3), el año (07), la parte entera de un cuarto del año (1) y el siglo (6 para el siglo 21). El total es 19. El residuo al dividir 19 entre 7, es 5. Corresponde al quinto día de la semana que es Viernes.
Los códigos que se deben sumar de acuerdo con el mes, son: Enero 0, Febrero 3, Marzo 3, Abril 6, Mayo 1, Junio 4, Julio 6, Agosto 2, Septiembre 5, Octubre 0, Noviembre 3 y Diciembre 5
Se suman el día, el mes (Enero 0, Febrero 3, Marzo 3, Abril 6, Mayo 1, Junio 4, Julio 6, Agosto 2, Septiembre 5, Octubre 0, Noviembre 3, Diciembre 5), el año (las dos últimas cifras), un cuarto del año (parte entera) y el siglo (para el siglo 21 es 6, para el siglo 20 es 0, para el siglo 19 es 2, para el siglo 18 es 4, para el siglo 17 es 6). El total se divide entre 7. Y el residuo de esta división determina el día de la semana buscado. Si es 1, el día buscado… Lee más »
Entonces, Albert Einstein nació un Viernes 14 de Marzo de 1879.
Cristobal Colón llegó al Nuevo Mundo un Miércoles 12 de Octubre de 1492.
Isaac Newton nació un Domingo 4 de Enero de 1643.
Si el año es bisiesto, la cifra para sumar en el mes de Enero es -1. Y para Febrero es 2.
Las cifras que se deben sumar de acuerdo con el siglo son: Siglo 11 (desde el año 1000 al 1099), sumar 2. Siglo 12 (desde el año 1100 al 1199), sumar 0. Siglo 13 (desde el año 1200 al 1299), sumar 6. Siglo 14 (desde el año 1300 al 1399), sumar 4. Siglo 15 (desde el año 1400 al 1499), sumar 2. Siglo 16 (desde el año 1500 al 1599), sumar 0. Siglo 17 (desde el año 1600 al 1699), sumar 6. Siglo 18 (desde el año 1700 al 1799), sumar 4. Siglo 19 (desde el año 1800 al 1899),… Lee más »
Excelente algoritmo. lo usé para implementar el manejo del dia de la semana en una aplicación de la empresa para la cual trabajo. el algoritmo lo desarrolle en RPG en un IBM AS400
me pueden explicar detalladamente como hallar el coeficiente B por favorrrr
Alguien me podría explicar como se calcula la tabla del coeficiente D