La determinación del día de la semana de una fecha determinada se puede realizar con una variedad de algoritmos . Además, los calendarios perpetuos no requieren ningún cálculo por parte del usuario y son esencialmente tablas de consulta. Una aplicación típica es calcular el día de la semana en que nació alguien o en que ocurrió un evento específico.
En el cálculo numérico, los días de la semana se representan como números de día laborable. Si el lunes es el primer día de la semana, los días pueden codificarse del 1 al 7, de lunes a domingo, como se practica en la norma ISO 8601. El día designado con 7 también puede contarse como 0 , aplicando el módulo 7 aritmético , que calcula el resto de un número después de la división por 7. Por lo tanto, el número 7 se trata como 0, el número 8 como 1, el número 9 como 2, el número 18 como 4, y así sucesivamente. Si el domingo se cuenta como el día 1, entonces 7 días después ( es decir , el día 8) también es un domingo, y el día 18 es el mismo que el día 4, que es un miércoles ya que este cae tres días después del domingo ( es decir , 18 mod 7 = 4 ). [a]
El enfoque básico de casi todos los métodos para calcular el día de la semana comienza partiendo de una "fecha de anclaje": un par conocido (como el 1 de enero de 1800 como miércoles), determinando el número de días entre el día conocido y el día que se está tratando de determinar, y usando la aritmética módulo 7 para encontrar un nuevo día numérico de la semana.
Un método estándar consiste en buscar (o calcular, utilizando una regla conocida) el valor del primer día de la semana de un siglo determinado, buscar (o calcular, utilizando un método de congruencia) un ajuste para el mes, calcular el número de años bisiestos desde el comienzo del siglo y luego sumar estos datos junto con el número de años desde el comienzo del siglo y el número del día del mes. Finalmente, se obtiene un recuento de días al que se aplica el módulo 7 para determinar el día de la semana de la fecha. [4]
Algunos métodos hacen todas las sumas primero y luego descartan los sietes, mientras que otros los descartan en cada paso, como en el método de Lewis Carroll. Cualquiera de los dos métodos es bastante viable: el primero es más fácil para las calculadoras y los programas informáticos, el segundo para el cálculo mental (es muy posible hacer todos los cálculos en la cabeza con un poco de práctica). Ninguno de los métodos que se dan aquí realiza comprobaciones de rango, por lo que las fechas poco razonables producirán resultados erróneos.
Cada séptimo día de un mes tiene el mismo nombre que el anterior:
Los "meses correspondientes" son aquellos meses dentro del año calendario que comienzan el mismo día de la semana. Por ejemplo, septiembre y diciembre corresponden, porque el 1 de septiembre cae el mismo día que el 1 de diciembre (ya que hay exactamente trece semanas de 7 días entre las dos fechas). Los meses solo pueden corresponder si el número de días entre sus primeros días es divisible por 7, o en otras palabras, si sus primeros días están separados por un número entero de semanas. Por ejemplo, febrero de un año común corresponde a marzo porque febrero tiene 28 días, un número divisible por 7, siendo 28 días exactamente cuatro semanas. En un año bisiesto , enero y febrero corresponden a meses diferentes que en un año común, ya que sumar 29 febrero significa que cada mes posterior comienza un día después.
Enero corresponde a octubre en años comunes y abril y julio en años bisiestos. Febrero corresponde a marzo y noviembre en años comunes y agosto en años bisiestos. Marzo siempre corresponde a noviembre, abril siempre corresponde a julio y septiembre siempre corresponde a diciembre. Agosto no corresponde a ningún otro mes en un año común. Octubre no corresponde a ningún otro mes en un año bisiesto. Mayo y junio nunca corresponden a ningún otro mes.
En la tabla de meses que aparece a continuación, los meses correspondientes tienen el mismo número, hecho que se desprende directamente de la definición.
Hay siete días posibles en los que puede comenzar un año, y los años bisiestos cambiarán el día de la semana después del 29 de febrero. Esto significa que hay 14 configuraciones que puede tener un año. Todas las configuraciones pueden ser referenciadas por una letra dominical , pero como el 29 de febrero no tiene ninguna letra asignada, un año bisiesto tiene dos letras dominicales, una para enero y febrero y la otra (un paso atrás en la secuencia alfabética) para marzo a diciembre.
2021 es un año común que comienza en viernes, lo que significa que corresponde al año calendario 2010. Los dos primeros meses de 2021 corresponden a los dos primeros meses de 2016. 2022 es un año común que comienza en sábado, lo que significa que corresponde al año calendario 2011. Los últimos diez meses de 2022 corresponden a los últimos diez meses de 2016. 2023 es un año común que comienza en domingo, lo que significa que corresponde al año calendario 2017. 2024 es un año bisiesto que comienza en lunes, lo que significa que corresponde al año calendario 1996. Los dos primeros meses de 2024 corresponden a los dos primeros meses de 2018. Los últimos diez meses de 2024 corresponden a los últimos diez meses de 2019.
Cada año bisiesto se repite una vez cada 28 años, y cada año común se repite una vez cada 6 años y dos veces cada 11 años. Por ejemplo, el último año bisiesto que comenzó en miércoles fue 2020 y el próximo será 2048. Del mismo modo, los próximos años comunes que comiencen en viernes serán 2027, 2038 y luego 2049. Ambas afirmaciones son verdaderas a menos que se salte un año bisiesto, pero eso no sucederá hasta 2100.
Para más detalles consulte la tabla siguiente.
Notas:
El "año 000" es, en cronología normal, el año 1 a. C. (que precede al 1 d. C.). En la numeración astronómica, el año 0 se sitúa entre el 1 a. C. y el 1 d. C. En el calendario juliano proléptico (es decir, el calendario juliano tal como habría sido si se hubiera aplicado correctamente desde el principio), el 1 a. C. comienza en jueves. En el calendario gregoriano proléptico (llamado así porque no se ideó hasta 1582), el 1 a. C. comienza en sábado.
Para las fechas julianas anteriores a 1300 y posteriores a 1999, se debe utilizar el año de la tabla que difiere en un múltiplo exacto de 700 años. Para las fechas gregorianas posteriores a 2299, se debe utilizar el año de la tabla que difiere en un múltiplo exacto de 400 años. Los valores " r0 " a " r6 " indican el resto cuando el valor de las centenas se divide por 7 y 4 respectivamente, indicando cómo se extiende la serie en cualquier dirección. Tanto los valores julianos como los gregorianos se muestran de 1500 a 1999 para mayor comodidad. Las cifras en negrita (por ejemplo, 04 ) denotan año bisiesto. Si un año termina en 00 y sus centenas están en negrita, es un año bisiesto. Por lo tanto, 19 indica que 1900 no es un año bisiesto gregoriano (pero 19 en la columna juliana indica que es un año bisiesto juliano, como lo son todos los años julianos x 00). 20 indica que 2000 es un año bisiesto. Utilice enero y febrero sólo en años bisiestos.
Para la determinación del día de la semana (1 de enero de 2000, sábado)
La fórmula es w = (d + m + y + c) mod 7.
Téngase en cuenta que la fecha (y, por lo tanto, el día de la semana) en los calendarios juliano y gregoriano revisados es la misma desde el 14 de octubre de 1923 hasta el 28 de febrero de 2800 d. C. inclusive y que para los años grandes puede ser posible restar 6300 o un múltiplo de ello antes de comenzar para así llegar a un año que esté dentro o más cerca de la tabla.
Para buscar el día de la semana de cualquier fecha de cualquier año utilizando la tabla, reste 100 al año, divida la diferencia por 100, multiplique el cociente resultante (omitiendo las fracciones) por siete y divida el producto por nueve. Anote el cociente (omitiendo las fracciones). Ingrese la tabla con el año juliano y, justo antes de la división final, agregue 50 y reste el cociente anotado anteriormente.
Ejemplo: ¿Cuál es el día de la semana del 27 de enero de 8315?
8315−6300=2015, 2015−100=1915, 1915/100=19 resto 15, 19×7=133, 133/9=14 resto 7. 2015 está 700 años adelantado respecto a 1315, por lo que se utiliza 1315. De la tabla: para centenas (13): 6. Para dígitos restantes (15): 4. Para mes (enero): 0. Para fecha (27): 27. 6 + 4 + 0 + 27 + 50 − 14 = 73 . 73/7=10 resto 3. Día de la semana = martes.
Para encontrar la letra dominical , calcula el día de la semana correspondiente al 1 de enero o al 1 de octubre. Si es domingo, la letra dominical es A, si es sábado, B, y de manera similar, hacia atrás a lo largo de la semana y hacia adelante a través del alfabeto hasta el lunes, que es G.
Los años bisiestos tienen dos letras dominicales, por lo que para enero y febrero calcule el día de la semana para el 1 de enero y para marzo a diciembre calcule el día de la semana para el 1 de octubre.
Los años bisiestos son todos los años que se dividen exactamente por cuatro con las siguientes excepciones:
En el calendario gregoriano : todos los años que se dividen exactamente por 100 (excepto aquellos que se dividen exactamente por 400).
En el calendario juliano revisado : todos los años que se dividen exactamente por 100 (excepto aquellos que dan un resto de 200 o 600 cuando se dividen por 900).
Este es un artefacto de matemáticas recreativas. Véase la regla del fin del mundo para obtener una explicación.
Utilice esta tabla para encontrar el día de la semana sin realizar ningún cálculo.
Ejemplos:
Diciembre está en la fila F y 26 está en la columna E , por lo que la letra de la fecha es C, ubicada en la fila F y la columna E. 93 (año mod 100) está en la fila D (fila del año) y la letra C en la fila del año está ubicada en la columna G. 18 ([año/100] en la columna del siglo gregoriano) está en la fila C (fila del siglo) y la letra en la fila del siglo y la columna G es B, por lo que el día de la semana es martes.
El 13 de octubre es un día F. La letra F en la fila del año (07) se encuentra en la columna G. La letra en la fila del siglo (13) y la columna G es E, por lo que el día de la semana es viernes.
El 1 de enero corresponde a G, G en la fila del año ( 0 0 ) corresponde a F en la fila del siglo ( 20 ), y F corresponde al sábado.
Una fórmula concisa para el método: "Letra de fecha (G), la letra (G) está en la fila del año ( 0 0), para la letra (F) está en la fila del siglo ( 20 ), y para el día, la letra (F) se convierte en día de la semana (sábado)" .
El método de la Carta Dominical
Cada día del año (excepto el 29 de febrero) tiene una letra asignada en la secuencia recurrente ABCDEFG. La serie comienza con A el 1 de enero y continúa hasta A nuevamente el 31 de diciembre. La letra del domingo es la que se encuentra junto a todos los domingos del año. Como el 29 de febrero no tiene letra, esto significa que la letra del domingo para marzo a diciembre está un paso atrás en la secuencia en comparación con la de enero y febrero. La letra para cualquier fecha se encontrará donde la fila que contiene el mes (en negro) a la izquierda del "cuadrado latino" se une con la columna que contiene la fecha sobre el "cuadrado latino". La letra del domingo se encontrará donde la columna que contiene el siglo (debajo del "cuadrado latino") se une con la fila que contiene los dos últimos dígitos del año a la derecha del "cuadrado latino". Para un año bisiesto, la letra del domingo encontrada de esta manera es la que se aplica a marzo a diciembre.
Así, por ejemplo, para encontrar el día de la semana del 16 de junio de 2020:
La columna "20" se encuentra con la fila "20" en "D". La fila "Junio" se encuentra con la columna "16" en "F". Como F está dos letras después de D, el día de la semana está dos días después del domingo, es decir, martes.
El método Rata Die funciona sumando la cantidad de días d que han transcurrido desde una fecha de día de la semana conocido D . El día de la semana se obtiene entonces mediante ( D + d ) mod 7 , de acuerdo con la convención que se haya utilizado para codificar D .
Por ejemplo, la fecha del 13 de agosto de 2009 es 733632 días a partir del 1 de enero del año 1 d.C. Tomando el número módulo 7, obtenemos 4, es decir, jueves.
Carl Friedrich Gauss describió un método para calcular el día de la semana correspondiente al 1 de enero de un año determinado en una nota manuscrita incluida en una colección de tablas astronómicas. [5] Nunca lo publicó. Finalmente, se incluyó en sus obras completas en 1927. [6] En comparación con Rata Die, el resultado ayuda a simplificar el recuento de años.
El método de Gauss era aplicable al calendario gregoriano. Numeró los días de la semana del 0 al 6 a partir del domingo. Definió la siguiente operación.
El procedimiento anterior se puede condensar en una única expresión para el caso gregoriano:
(D + m + 5(( A −1)%4) + 4(( A −1)%100) + 6(( A −1)%400))%7
Para el año número 2000, A − 1 = 1999 , Y − 1 = 99 y C = 19 , el día de la semana del 1 de enero es
Los días laborables del 30 de abril de 1777 y del 23 de febrero de 1855 son
y
El algoritmo para el día de la semana del 1 de enero se puede demostrar mediante aritmética de módulo. El punto principal es que, como 365 % 7 = 1 , cada año suma 1 día a la progresión. El resto es un ajuste para el año bisiesto. Las versiones basadas en siglos tienen 36525 % 7 = 6 .
La tabla de desfases entre meses muestra una divergencia en febrero debido al año bisiesto. Una técnica común (que luego utilizó Zeller) es desplazar el mes para que comience en marzo, de modo que el día bisiesto esté al final del conteo. Además, como Zeller demostró más tarde, la tabla se puede reemplazar por una expresión aritmética.
Esta fórmula también fue convertida en métodos gráficos y tabulares para calcular cualquier día de la semana por Kraitchik y Schwerdtfeger. [6] [7]
La siguiente fórmula es un ejemplo de una versión sin tabla de búsqueda. Se supone que el año comienza en marzo, lo que significa que las fechas de enero y febrero deben considerarse parte del año anterior. La fórmula para el calendario gregoriano es [8]
dónde
En el algoritmo de Zeller, los meses se numeran desde el 3 para marzo hasta el 14 para febrero. Se supone que el año comienza en marzo; esto significa, por ejemplo, que enero de 1995 debe considerarse el mes 13 de 1994. [9]
La fórmula para el calendario gregoriano es
donde
La única diferencia es una entre el algoritmo de Zeller ( Z ) y el algoritmo gaussiano dispar ( G ), es decir Z − G = 1 = domingo .
El algoritmo de Wang [10] para el cálculo humano del calendario gregoriano es (la fórmula debe restarse en 1 si m es 1 o 2 si el año es bisiesto)
donde
Se puede derivar un algoritmo para el calendario juliano a partir del algoritmo anterior, donde es el día del juicio final.
En un método parcialmente tabular de Schwerdtfeger, el año se divide en el siglo y el año de dos dígitos dentro del siglo. El enfoque depende del mes. Para m ≥ 3 ,
Entonces g está entre 0 y 99. Para m = 1,2 ,
La fórmula para el día de la semana es [6]
donde se elige el módulo positivo. [6]
El valor de e se obtiene de la siguiente tabla:
El valor de f se obtiene de la siguiente tabla, que depende del calendario. Para el calendario gregoriano, [6]
Para el calendario juliano, [6]
Charles Lutwidge Dodgson ( Lewis Carroll ) ideó un método parecido a un rompecabezas, aunque parcialmente tabular al utilizar los mismos números de índice para los meses que en la "Tabla completa: calendarios juliano y gregoriano" anterior. Enumera los mismos tres ajustes para los primeros tres meses de los años no bisiestos, uno 7 veces más alto para el último, y da instrucciones crípticas para encontrar el resto; sus ajustes para los siglos se deben determinar utilizando fórmulas similares a las de la tabla de siglos. Aunque es explícito al afirmar que su método también funciona para las fechas del estilo antiguo , su ejemplo reproducido a continuación para determinar que "1676, 23 de febrero" es un miércoles solo funciona en un calendario juliano que comienza el año el 1 de enero, en lugar del 25 de marzo como en el calendario juliano de "estilo antiguo" .
Algoritmo: [11]
Tome la fecha dada en cuatro partes, a saber: el número de siglos, el número de años transcurridos, el mes y el día del mes.
Calcule los 4 elementos siguientes y, cuando los encuentre, añada cada uno al total de los elementos anteriores. Cuando un elemento o total sea mayor que 7, divida por 7 y conserve solo el resto.
Partida del siglo: Para el ' Estilo antiguo ' (que terminó el 2 de septiembre de 1752) restar de 18. Para el ' Estilo nuevo ' (que comenzó el 14 de septiembre de 1752) dividir por 4, tomar el sobrante más [excedente] de 3, multiplicar el resto por 2.
Año-artículo: Sume el número de docenas, el sobrante y el número de 4 en el sobrante.
Elemento del mes: si comienza o termina con vocal, se resta el número que indica su lugar en el año a 10. Esto, más su número de días, da el elemento para el mes siguiente. El elemento para enero es "0"; para febrero o marzo, "3"; para diciembre, "12".
Día-elemento: El total así obtenido debe corregirse, deduciendo "1" (sumando primero 7, si el total es "0"), si la fecha es enero o febrero de un año bisiesto, recordando que todo año divisible por 4 es bisiesto, exceptuando únicamente los años-siglos, en 'Nuevo Estilo', cuando el número de siglos no es tan divisible (por ejemplo, 1800).
El resultado final da el día de la semana, siendo “0” el domingo, “1” el lunes, y así sucesivamente.
Ejemplos: [11]
17, dividido por 4, deja "1" de más; 1 de 3 da "2"; dos veces 2 es "4". 83 son 6 docenas y 11, dando 17; más 2 da 19, es decir (dividiendo por 7) "5". Total 9, es decir "2" El artículo para agosto es "8 de 10", es decir "2"; por lo tanto, para septiembre, es "2 más 31", es decir "5" Total 7, es decir "0", que sale. 18 da "4". Respuesta: "Jueves".
16 de 18 da "2" 76 es 6 docenas y 4, lo que da 10; más 1 da 11, es decir "4". Total "6" El elemento para febrero es "3". Total 9, es decir "2" 23 da "2". Total "4" La corrección para el año bisiesto da "3". Respuesta: "miércoles".
Las fechas anteriores a 1752 se darían en Inglaterra según el calendario antiguo , con el 25 de marzo como primer día del nuevo año . Sin embargo, el método de Carroll supone el 1 de enero como primer día del año, por lo que no consigue llegar a la respuesta correcta, es decir, "viernes".
Si hubiera notado que el 23 de febrero de 1676 (con el 25 de marzo como Año Nuevo) es en realidad el 23 de febrero de 1677 (con el 1 de enero como Año Nuevo), habría tenido en cuenta los diferentes números de año (al igual que el cumpleaños de George Washington ) entre los dos calendarios. Entonces su método arroja:
16 de 18 da "2" 77 son 6 docenas y 5, lo que da 11; más 1 da 12, es decir "5". Total "7" El artículo para febrero es "3". Total 10, es decir "3" 23 da "2". Total "5". Respuesta: "viernes".
Es digno de destacar que aquellos que han republicado el método de Carroll no han señalado su error, más notablemente Martin Gardner . [12]
En 1752, el Imperio británico abandonó el uso del calendario juliano de estilo antiguo para adoptar el calendario gregoriano , que se ha convertido en el estándar actual en la mayoría de los países del mundo. Para obtener más información, consulte Fechas de estilo antiguo y de estilo nuevo .
En las expresiones del lenguaje Cy
que aparecen a continuación, , m
y d
son, respectivamente, variables enteras que representan el año (por ejemplo, 1988), el mes (1-12) y el día del mes (1-31).
( d + = m < 3 ? y -- : y -2 , 23 * m / 9 + d + 4 + y / 4 - y / 100 + y / 400 ) % 7
En 1990, Michael Keith y Tom Craver publicaron la expresión anterior que busca minimizar la cantidad de pulsaciones de teclas necesarias para ingresar una función autónoma para convertir una fecha gregoriana en un día numérico de la semana. [13] Devuelve 0
= domingo, 1
= lunes, etc. Esta expresión utiliza un componente de mes menos engorroso que el algoritmo de Zeller.
Poco después, Hans Lachman optimizó su algoritmo para facilitar su uso en dispositivos de gama baja. Como fue diseñado originalmente para calculadoras de cuatro funciones, su método necesita menos entradas en el teclado al limitar su rango a 1905-2099 d. C. o a fechas julianas históricas. Más tarde se modificó para convertir cualquier fecha gregoriana, incluso en un ábaco . En los dispositivos basados en Motorola 68000 , hay una necesidad similar de registros de procesador o códigos de operación , según el objetivo de diseño previsto. [14]
El precursor tabular del algoritmo de Tøndering está incorporado en la siguiente función K&R C. [15] Con cambios menores, fue adaptado para otros lenguajes de programación de alto nivel como APL2 . [16] Publicado por Tomohiko Sakamoto en el grupo de noticias Usenet comp.lang.c en 1992, es preciso para cualquier fecha gregoriana. [17] [18]
dayofweek ( y , m , d ) /* 1 <= m <= 12, y > 1752 (en el Reino Unido) */ { static int t [] = { 0 , 3 , 2 , 5 , 0 , 3 , 5 , 1 , 4 , 6 , 2 , 4 }; if ( m < 3 ) { y -= 1 ; } return ( y + y / 4 - y / 100 + y / 400 + t [ m -1 ] + d ) % 7 ; }
Devuelve 0
= domingo, 1
= lunes, etc.
Sakamoto también publicó simultáneamente una versión más ofuscada:
dow ( m , d , y ) { y -= m < 3 ; return ( y + y / 4 - y / 100 + y / 400 + "-cama=pluma+mad." [ m ] + d ) % 7 ; }
Esta versión codifica los desplazamientos de los meses en la cadena y, como resultado, requiere una computadora que use ASCII estándar para ejecutar el algoritmo correctamente, lo que reduce su portabilidad . Además, ambos algoritmos omiten int
las declaraciones de tipo , lo que está permitido en el C K&R original , pero no en el C ANSI .
(El algoritmo de Tøndering es, nuevamente, similar en estructura a la congruencia de Zeller y al código corto de Keith, excepto que el componente relacionado con el mes es 31*m/12
. El de Sakamoto está en algún lugar entre el gaussiano dispar y el algoritmo de Schwerdtfeger, aparentemente sin tener en cuenta la forma de expresión).
% ejemplo de fecha de entrada y1 = 2022 ; m1 = 1 ; d1 = 1 ; month_offset = [ 0 3 3 6 1 4 6 2 5 0 3 5 ]; % año común % de desplazamiento si y1 es año bisiesto si mod ( y1 , 4 ) == 0 && mod ( y1 , 100 ) == 0 && mod ( y1 , 400 ) == 0 month_offset =[ 0 3 4 0 2 5 0 3 6 1 4 6 ]; % fin año bisiesto % Gregor día_semana_gregor = rem ( d1 + mes_desplazamiento ( m1 ) + 5 * rem ( y1 - 1 , 4 ) + 4 * rem ( y1 - 1 , 100 ) + 6 * rem ( y1 - 1 , 400 ), 7 ) % Día de la semana juliano_juliano = rem ( 6 + 5 * rem ( y1 - 1 , 4 ) + 3 * ( y1 - 1 ), 7 )
0: Domingo 1: Lunes .. 6: Sábado
desde numpy importa resto como remdef is_leap_year ( year : int ) -> bool : """ Determina si un año es bisiesto. """ return year % 4 == 0 and ( year % 100 != 0 or year % 400 == 0 ) def day_of_week ( y : int , m : int , d : int ) -> str : ''' devuelve el día de la semana de la fecha dada como cadena, usando el algoritmo de Gauss para encontrarlo ''' if is_leap_year ( y ): month_offset = ( 0 , 3 , 4 , 0 , 2 , 5 , 0 , 3 , 6 , 1 , 4 , 6 )[ m - 1 ] else : month_offset = ( 0 , 3 , 3 , 6 , 1 , 4 , 6 , 2 , 5 , 0 , 3 , 5 )[ m - 1 ] y -= 1 wd = int ( rem ( d + month_offset + 5 * rem ( y , 4 ) + 4 * rem ( y , 100 ) \ + 6 * rem ( y , 400 ) , 7 )) regresar ( 'Dom' , 'Lun' , 'Mar' , 'Mié' , 'Jue' , 'Vie' , 'Sáb' )[ wd ]
NWDOSTIP.TXT
es un trabajo exhaustivo sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y componentes internos no documentados. Es parte de la MPDOSTIP.ZIP
colección aún más grande del autor, mantenida hasta 2001 y distribuida en muchos sitios en ese momento. El enlace provisto apunta a una versión anterior del NWDOSTIP.TXT
archivo convertida a HTML).