Cómo calcular qué día de la semana fue

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

Author: ^DiAmOnD^

Miguel Ángel Morales Medina. Licenciado en Matemáticas y autor de Gaussianos y de El Aleph. Puedes seguirme en Twitter o indicar que te gusta mi página de Facebook.

53 Comments

  1. 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.

    Post a Reply
    • 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

      Post a Reply
      • 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 arroja la suma)= 6. Nos da 6, lo que quiere decir que será viernes.
        Saludos, espero que te sirva.

        Post a Reply
        • perdona, pero 28 de julio de2016 fue JUEVES

          Post a Reply
        • mi nombre es Neil, nací el 29 de noviembre de 1968, ahora quiero saber qué día nací

          Post a Reply
          • Jueves

          • Naciste un día VIERNES

            y no un jueves

      • cae l mismo dia cada 28 años

        Post a Reply
  2. y las adaptaciones anteriores … cambio del calendario juliano al gregoriano?

    Post a Reply
  3. 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

    Post a Reply
  4. 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, (parte entera de año/100)
    Si el dato >= 15/10/1582, A = 5, 3, 1 ó 0 según sea cc (mod 4) 1, 2, 3 ó 0.
    Si el dato

    Post a Reply
  5. Si la fecha es anterior a 15/10/1582, A = 19 – cc

    Post a Reply
  6. 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.

    Post a Reply
  7. 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.

    Post a Reply
    • fue un viernes.tiene truco, ya q cada 28 años cae el mismo dia. curratelo

      Post a Reply
  8. cual es el mes que cambiaria de valor si es bisiesto es enero o febrero?

    Post a Reply
  9. El numero con el que voy a restar el total de valores calculados siempre va ser 7?
    URGENTE!!!!!!!!!!!

    Post a Reply
  10. 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»

    Post a Reply
    • 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

      Post a Reply
  11. 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 Christian Johannes Zeller, un sacerdote protestante
    alemán que vivió en el siglo XIX.

    Zeller observó que existía una dependencia entre las fechas del calendario gregoriano
    y el día de la semana que les correspondía.
    A raíz de esa observación, obtuvo (se dice que por tanteo), esta fórmula,
    en apariencia mágica, que lleva su nombre.
    }

    var
    e, f: word;

    begin
    if (m <= 2) then begin
    m := m + 10;
    a := a – 1;
    end else
    m := m – 2;
    e := a mod 100;
    f := a div 100;
    result := (700 + ((26 * m – 2) div 10) + d + e + e div 4 + f div 4 – 2 * f) mod 7
    end;

    begin
    i := Zeller (1, Mes, Anio);
    n := DaysInAMonth (Anio, Mes) //Función de delphi, devuelve la cantidad de días del mes sea año viciesto o no

    //No me extrañaría que delphi tenga ya en algún lado una función que devuelva
    //donde empieza el calendario…
    end;

    Procedure Mostrar (const Inicio, TotalDias, Mes, Anio: Integer);
    const
    M: array[1..12] of string = ('ENERO', 'FEBRERO', 'MARZO', 'ABRIL', 'MAYO', 'JUNIO',
    'JULIO', 'AGOSTO', 'SEPTIEMBRE', 'OCTUBRE', 'NOVIEMBRE', 'DICIEMBRE');
    var
    I, J, K, L: Integer;

    begin
    WriteLn (M[mes], ' del ', Anio);
    WriteLn;
    WriteLn (' D L M X J V S');
    WriteLn (' ——————————-');

    K := 1;
    L := 0;
    for I := 1 to 6 do begin
    for J := 1 to 7 do begin
    if (L TotalDias) then begin
    Write (‘ ‘);
    Inc (L)
    end else begin
    Write (K:5);
    inc (K)
    end
    end;
    WriteLn
    end
    end;

    var
    Mes, Anio, TDias, IniMes: Integer;
    Respuesta: Char;

    begin
    try
    repeat
    Ingresar (Anio);
    for Mes := 1 to 12 do begin
    Procesar (Mes, Anio, TDias, IniMes);
    Mostrar (IniMes, TDias, Mes, Anio);
    ReadLn
    end;

    WriteLn;
    Write (‘Otro anio? ‘);
    ReadLn (Respuesta);
    Respuesta := UpCase (Respuesta)
    until Respuesta ‘S’
    except
    on E: Exception do
    ShowMessage(E.ClassName + ‘: ‘ + E.Message)
    end
    end.

    Post a Reply
  12. 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?

    Post a Reply
  13. 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

    Post a Reply
  14. 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

    Post a Reply
  15. 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???

    Post a Reply
  16. 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 el inicio del intervalo sea o no bisiesto, como se propone en la cabecera también funciona, pero la que yo sugiero parece más estética porque todos los valores son positivos.

    La propuesta arriba quedaría así:

    +5, +3, +1, 0, -2, -4, -6, -7, -9, -11, -13, -14, -16, -18, -20, -21 y -23.

    Para el intervalo 2800-2899 queda A=-21, y -21 es congruente con 0 módulo 7 y el resultado sigue siendo jueves.

    Una curiosidad: dentro de cada milenio el calendario se repite cada 400 años. Es decir, el calendario de 2014 vale vpara 2414 y para 2814.

    Otra curiosidad: dentro de un cada siglo el calendario se repite cada 28 años. Es decir, el calendario de 2014 vale para 2042, para 2070 y para 2098. Y este año, al haber sido bisiesto el 2000, podríamos utilizar los de 1986 o de 1958 que tengamos viejos en casa.

    Post a Reply
  17. 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

    Post a Reply
  18. 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.

    Post a Reply
  19. 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 un ministerio de España y tengo ilusión por presentarme a un concurso de televisión. Muchas gracias y un cordial saludo..

    Post a Reply
  20. El sábado , 2 de abril del 88 y el sábado , 11 de marzo del 89.

    Post a Reply
  21. 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/

    Post a Reply
    • 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

      Post a Reply
  22. 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)

    Post a Reply
  23. 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?

    Post a Reply
    • Por un error no se mostraba la tabla de meses completa. Ahora sí debería verse entera. Gracias por el aviso :).

      Post a Reply
  24. 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

    Post a Reply
  25. Hey Que excelente trabajo, me sirvio mucho para realizar el programa que determina lo mismo en html5 con javascript muchas gracias ¡¡¡¡

    Post a Reply
  26. 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

    Post a Reply
    • 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.

      Post a Reply
    • fue martes, tonto, si no sabes calcular o inglés comprueba tu respuesta antes de comentar

      Post a Reply
  27. 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 \sqrt{8} por Pitágoras, o 2\sqrt{2}. Por tanto la mitad de la diagonal es \sqrt{2}, menos el radio que es 1, resulta que la diagonal pequeña mide \sqrt{2}-1.

    De nuevo por Pitágoras el lado del cubo pequeño mide \frac{2-\sqrt{2}}{2}, luego el radio pequeño es 2-\sqrt{2} y por tanto su área es a=\pi\cdot(6-4\sqrt{2}).

    Post a Reply
  28. 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.

    Post a Reply
  29. 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?

    Post a Reply
    • 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

      Post a Reply
  30. 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 sería Lunes ; si es 2, el día buscado es Martes; si es 3, el día buscado es Miércoles; si es 4, el día buscado es Jueves, etc. Si es cero, el día buscado es Domingo.
    Ejemplo 1. ¿Qué día de la semana será el 31 de Diciembre del 2019?.
    Solución: 31 + 5 + 19 + 4 + 6 = 65. Al dividir 65 entre 7, el residuo es 2. Corresponde al día Martes.

    Ejemplo2. ¿Qué día de la semana fue el 14 de Marzo de 1879?
    Solución: 14 + 3 + 79 + 19 + 2 = 117. Al dividir 117 entre 7, el residuo es 5. Corresponde al día Viernes.

    Post a Reply
    • 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.

      Post a Reply
    • Si el año es bisiesto, la cifra para sumar en el mes de Enero es -1. Y para Febrero es 2.

      Post a Reply
  31. 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), sumar 2
    Siglo 20 (desde el año 1900 al 1999), sumar 0.
    Siglo 21 (desde el año 2000 al 2099), sumar 6
    Siglo 22 (desde el año 2100 al 2199), sumar 4.

    Post a Reply

Puedes utilizar código LaTeX para insertar fórmulas en los comentarios. Sólo tienes que escribir
[latex]código-latex-que-quieras-insertar[/latex]
o
$latex código-latex-que-quieras-insertar$.

Si tienes alguna duda sobre cómo escribir algún símbolo puede ayudarte la Wikipedia.

Y si los símbolos < y > te dan problemas al escribir en LaTeX te recomiendo que uses los códigos html & lt; y & gt; (sin los espacios) respectivamente.

Submit a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.