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

Share

Autor: ^DiAmOnD^

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

32 Comentarios

  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.

    Publica una respuesta
    • 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

      Publica una respuesta
  2. y las adaptaciones anteriores … cambio del calendario juliano al gregoriano?

    Publica una respuesta
  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

    Publica una respuesta
  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

    Publica una respuesta
  5. 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.

    Publica una respuesta
  6. 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.

    Publica una respuesta
  7. cual es el mes que cambiaria de valor si es bisiesto es enero o febrero?

    Publica una respuesta
  8. El numero con el que voy a restar el total de valores calculados siempre va ser 7?
    URGENTE!!!!!!!!!!!

    Publica una respuesta
  9. 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”

    Publica una respuesta
  10. 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.

    Publica una respuesta
  11. 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?

    Publica una respuesta
  12. 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

    Publica una respuesta
  13. 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

    Publica una respuesta
  14. 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.

    Publica una respuesta
  15. 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

    Publica una respuesta
  16. 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.

    Publica una respuesta
  17. 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..

    Publica una respuesta
  18. 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/

    Publica una respuesta
    • 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

      Publica una respuesta
  19. 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)

    Publica una respuesta
  20. 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?

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

      Publica una respuesta
  21. 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

    Publica una respuesta
  22. Hey Que excelente trabajo, me sirvio mucho para realizar el programa que determina lo mismo en html5 con javascript muchas gracias ¡¡¡¡

    Publica una respuesta

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.

Envía un comentario

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