Ideas de programación del calendario perpetuo
Por supuesto que uso la fórmula de Zeiler
Finalmente, adjunto una de mis respuestas anteriores.... Conoce la dirección
/question/9433604.html
El calendario perpetuo no implementa el calendario lunar
¿Cómo calcular el día de la semana que es un día determinado?
slowtiger publicado el 2005-10-11 21:43:00
¿Cómo calcular qué día de la semana es un día determinado?
——Fórmula de Zeller
¿Qué día de la semana es un ¿Cierto día en la historia? ¿Qué día de la semana será en el futuro? Con respecto a este problema, existen muchas fórmulas de cálculo (dos fórmulas de cálculo generales y algunas fórmulas de cálculo por partes), la más famosa de las cuales es la fórmula de Zeller.
Es decir, w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
El significado de los símbolos en la fórmula son los siguientes, w: semana; c: siglo-1; y: año (dos dígitos m: mes (m es mayor o igual a 3, menor o igual a 14, es decir, en); La fórmula de Zeiler, enero y febrero de un año determinado dependen del cálculo se basa en los meses 13 y 14 del año anterior, por ejemplo, el 1 de enero de 2003 se calcula como el 1 de marzo de 2002; d: día; , es decir, solo se requiere la parte entera. (C es el siglo menos uno, y son los dos últimos dígitos del año, M es el mes y d es el número de días.
Enero y febrero deben calcularse según los días 13 y 14 meses del año anterior. Esto cuando C e y se valoran según el año anterior)
La W calculada se divide por 7 y el resto es el día de la semana. Si el resto es 0, es domingo.
Tome el 1 de octubre de 2049 (el centenario del Día Nacional) como ejemplo, use la fórmula de Zeller para calcular, el proceso es el siguiente:
Fórmula de Zeller: w = y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4] - 2×2[26× (11)/10]+1-1
=49+[12.25]+5-4[28.6]
=49 + 12+5-428
=54 (dividido por 7, el resto es 5)
Es decir, el 1 de octubre de 2049 (el centenario del Día Nacional) es un viernes.
¿Cuándo es tu cumpleaños (cuándo naciste, este año, el año que viene)? También podría intentarlo.
Sin embargo, la fórmula anterior solo es adecuada para la situación posterior al 15 de octubre de 1582 (el Papa en ese momento cambió el calendario juliano establecido por César al calendario gregoriano, que es el calendario gregoriano que se usa hoy).
Derivación del proceso: (Aquellos que no estén interesados en el razonamiento pueden omitirlo)
El sistema semanal es un sistema con tradiciones antiguas. Se dice que debido a que el Génesis de la Biblia estipula que Dios pasó seis días para crear el mundo y descansó el séptimo día, la gente también usa siete días como un ciclo para organizar su trabajo y su vida.
trabajo, y El domingo es día libre. Desde un punto de vista práctico, un ciclo de siete días es más apropiado. Entonces,
Aunque el ciclo de trabajo tradicional de China es de diez días (por ejemplo, los "Diez Días de Descanso" mencionados en el "Prefacio del Pabellón Tengwang" de Wang Bo") significa que
se refiere al El trabajo del funcionario cada diez días (por ciclo, el décimo día libre), pero más tarde también adoptó el sistema de semana occidental.
En la vida diaria, muchas veces nos encontramos con el problema de saber en qué día de la semana es un día determinado. A veces, también queremos saber qué día de la semana fue un determinado día de la historia. Normalmente, la forma efectiva de solucionar este problema es mirar el calendario, pero nunca llevamos un calendario con nosotros en todo momento y mucho menos un calendario perpetuo que tiene miles de años de historia. Si desea calcular el día de la semana en programación informática, es aún menos realista guardar un calendario perpetuo con antelación. En este momento, ¿hay alguna manera de utilizar alguna fórmula para deducir el día de la semana del año, mes y día?
La respuesta es sí. De hecho, nosotros también hacemos esto a menudo. Comencemos con un ejemplo simple.
Por ejemplo, si sabe
que el 1 de mayo de 2004 es sábado, entonces no es difícil calcular el día de la semana en el que el "Día Mundial Sin Tabaco" es el 31 de mayo de 2004.
p>
Podemos contar con los dedos del 1 al 31, y al mismo tiempo contar las semanas, y finalmente podemos contar que el 31 de mayo es lunes.
De hecho, al utilizar cálculos matemáticos, no es necesario romperse los dedos. Sabemos que las semanas se completan en siete días, por lo que el 1 de mayo es sábado y siete días después, el 8 de mayo también es sábado. En términos de fechas, 8-1=7, que es múltiplo de 7. De manera similar, el 15 de mayo, 22 de mayo y 29 de mayo también son sábados, y las diferencias entre sus fechas y el 1 de mayo son 14, 21 y 28 respectivamente, además
Son todos múltiplos de 7. ¿Qué pasa con el 31 de mayo? 31-1=30 Aunque no es múltiplo de 7, cuando se divide 31 entre 7, el resto es 2.
Esto significa que la semana del 31 de mayo es dos días después de la semana de mayo. 1er cielo. Dos días después del sábado es lunes.
Este sencillo cálculo nos da una idea básica para calcular la semana: Primero, primero debemos saber el día de la semana que es un día determinado antes del día que queremos calcular
"origen". En segundo lugar, para saber cuántos días hay de diferencia entre el día que desea calcular y el día determinado, divida la diferencia de esta fecha entre 7. El resto significa que la semana del día que desea calcular es posterior a la semana del determinado. día.cuantos dias. Si el resto es
0, significa que los dos días tienen el mismo día de la semana. Obviamente, si se selecciona el domingo como día de "origen", el resto será exactamente igual al día de la semana, lo que hace que el cálculo sea más conveniente.
Sin embargo, todavía resulta engorroso calcular directamente el número de días entre dos días. Por ejemplo, hay 7947 días entre el 29 de julio de 1982 y el 1 de mayo de 2004, que no se pueden calcular de una vez. Incluye tres períodos de tiempo: primero, los días restantes del año posterior al 29 de julio de 1982; segundo, el número total de días en los veintiún años completos desde 1983 a 2003; tercero, desde 2004; >El número de días desde el día de Año Nuevo hasta el 1 de mayo. El segundo período es más fácil de calcular y es igual a 21*365+5=7670 días. La razón por la cual se agrega 5 es porque hay 5 años bisiestos durante este período. El primer y tercer párrafo son más problemáticos. Por ejemplo, en el tercer párrafo, debe sumar el número de días de los cuatro meses anteriores a mayo más el valor de la fecha, es decir, 31 + 29 + 31 + 30 + 1. = 122 días. De manera similar, el primer párrafo debe sumar el número de días de los cinco meses posteriores a julio, más el número de días restantes de julio, un día son 155 días.
Entonces, el número de días entre el total de *** es 122+767155=7947 días.
Piénselo detenidamente. Si se selecciona la fecha del "origen" como el 31 de diciembre, entonces el primer período de tiempo será un año completo. el segundo período de tiempo se puede combinar y calcular, y el número total de todo el año es exactamente igual a la diferencia anual de los dos días menos uno. Si se selecciona además la fecha de "origen" como el 31 de diciembre del año 1 a. C. (o el 31 de diciembre del año 0 d. C. como lo utilizan los astrónomos), el número total para todo el año será exactamente lo que queremos. Disminuya el año del día calculado en. uno. Después de esta simplificación, solo necesitas calcular dos periodos de tiempo: primero, el número total de días en tantos años enteros; segundo, ¿cuántos días en este año quieres contar? Casualmente, según la configuración de año y mes del calendario gregoriano, si trabajamos hacia atrás de esta manera, el 31 de diciembre del año 1 a.C. resulta ser domingo. En otras palabras, el número total de días calculado de esta manera es el resto dividido por 7. . Exactamente qué día de la semana es. Entonces la pregunta ahora es
Solo hay una: ¿cuántos años bisiestos hay en tantos años enteros? Esto requiere comprender las reglas de salto del calendario gregoriano.
Sabemos que el calendario gregoriano tiene 365 días en los años ordinarios y 366 días en los años bisiestos. El método para establecer saltos es agregar un día en febrero para los años que son divisibles por 4.
Pero si el año es divisible por 100, no habrá salto. Si es divisible por 400, no habrá. será un salto.
Por lo tanto, años como 1600, 2000 y 2400 son años bisiestos, mientras que los años 1700, 1800, 1900 y 2100 son años ordinarios. El año 1 a. C. también es un año bisiesto según el calendario gregoriano.
Por lo tanto, para todos los años bisiestos en todos los años
desde el 31 de diciembre del año 1 a.C. (o 0 d.C.) hasta un día determinado del año Y, es igual a
[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400],
[... ] significa tomar solo el número entero parte. El primer elemento indica que es necesario sumar el número de años divisible por 4, el segundo indica que es necesario eliminar el número de años divisible por 100 y el tercer elemento indica que es necesario sumar el número de años divisible por 400. agregado. La razón por la que hay que reducir Y en uno es que
De esta forma obtenemos la primera fórmula para calcular el día de la semana para un día determinado:
W = ( Y-1)*365 + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (1)
Donde D es el número acumulado de días de este día en este año. La W calculada es el número de días entre el 31 de diciembre del año 1 a.C. (o 0 d.C.) y este día. Divida W entre 7, cuál es el resto y este día es el día de la semana. Por ejemplo,
calculemos el 1 de mayo de 2004:
W = (2004-1)*365 + [(2004-1)/4] - [(2004-1 ) /100] + [(2004-1)/400] +
(31+29+31+31)
= 731702,
731702 / 7 = 104528...6, el resto es seis, lo que indica que este día es sábado. Esto es consistente con los hechos.
Aunque la fórmula anterior (1) es muy precisa, el número calculado es demasiado grande y su uso es muy incómodo. Si lo piensas detenidamente, de hecho, la cantidad de días W se usa solo para obtener el resto después de dividirlo por 7. Esto nos inspira:
¿Podemos simplificar este valor de W? Simplemente encuentre un número más pequeño que sea igual a su resto. En términos de teoría de números, encontramos un entero positivo más pequeño. que sea congruente con él todavía puede calcular el número exacto de semanas.
Obviamente, la razón por la cual W es tan grande es porque el primer término (Y-1)*365 en la fórmula es demasiado grande. De hecho,
(Y-1)*365 = (Y-1) * (364+1)
= (Y-1) * (7*52+1)
= 52 * (Y-1) * 7 + (Y-1),
El primer término de este resultado es múltiplo de 7, y el resto después de dividir por 7 es 0, por lo que el resto de (Y-1)*365 dividido por 7 es en realidad igual al resto de Y-1 dividido por 7.
Esta relación se puede expresar como:
(Y-1)*365 ≡ Y-1 (mod 7).
Entre ellos, ≡ es el símbolo que indica congruencia en la teoría de números Mod 7 significa que cuando se usa 7 como módulo (es decir, el divisor),
ambos lados del. signo ≡ Los números son congruentes. Por tanto, (Y-1) se puede utilizar para sustituir (Y-1)*365, de modo que obtenemos la famosa y más común fórmula para calcular el día de la semana:
W = (Y- 1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (2)
Aunque esta fórmula es mucho más fácil de usar, no es la fórmula más útil porque el cálculo del número acumulado de días D también es problemático
¿Se puede calcular directamente utilizando el número de mes y la fecha? La respuesta también es sí.
También podríamos observar el número de días de cada
mes, la lista es la siguiente:
Meses: enero, febrero, marzo, abril, mayo, junio, julio, agosto , Septiembre, Octubre Noviembre Diciembre
------------------------------------- ----- ----------------------------------
Número de días: 31 28(29) 31 30 31 30 31 31 30 31 30 31
Si restas 28 (=4*7) de este número de días, no afectará el valor restante de W dividido por 7 . De esta forma obtenemos otra tabla:
Mes: enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre
--- ------------------------------------------ -------- --------------------
Número de días restantes: 3 0(1) 3 2 3 2 3 3 2 3 2 3
Acumulación de años normales: 3 3 6 8 11 13 16 19 21 24 26 29
Acumulación de años bisiestos: 3 4 7 9 12 14 17 20 22 25 27 30
Si observa de cerca, encontraremos que, excluyendo enero y febrero, los días restantes en los cinco meses de marzo a julio son 3,2,3,2,
8 Los valores de día para; los cinco meses de enero a diciembre también son 3, 2, 3, 2, 3, lo cual es exactamente una repetición. Entre los días acumulados correspondientes,
La diferencia entre los días acumulados del mes siguiente y los días acumulados del mes anterior menos 28 es esta repetición. Precisamente por la existencia de esta regla, el número acumulado de días en años ordinarios y bisiestos se puede expresar fácilmente mediante fórmulas matemáticas:
╭ d (cuando M=1)
;D = { 31 + d; (cuando M=2) (3)
╰ [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d + yo. (Cuando M≥3)
Donde [...] todavía significa tomar solo la parte entera; M y d son el mes y el día que desea calcular respectivamente i=0; y años bisiestos
i=1. Es necesario explicar la expresión M≥3: [13*(M+1)/5]-7 se calcula a partir del valor acumulado anual promedio en la segunda tabla anterior, más (M-1)*28 es el número total de días en todos los meses anteriores al mes que desea contar. Esta es una forma muy inteligente de utilizar operaciones de redondeo para realizar el ciclo de 3,2,3,2,3. Por ejemplo, para el 1 de mayo de 2004, hay:
D = [ 13 * (5+1) / 5 ] - 7 + (5-1) * 28 + 1 + 1
= 122,
Este es exactamente el número acumulado de días desde el 1 de mayo de 2004.
Si hacemos otro cambio y tratamos enero y febrero como el "13" y "14" del año anterior, no sólo seguirá
cumpliendo con esta fórmula, sino también porque de esto, el día bisiesto se convierte en el último día del "año" anterior (hay 14 meses en un año) y pasa a formar parte de d, por lo que el impacto del año bisiesto también se elimina, la fórmula se simplifica a: <. /p>
D = [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d. (3≤M≤14) (4)
La fórmula anterior para calcular los días de la semana se puede simplificar aún más a:
W = (Y-1) + [( Y- 1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] - 7
+ ( M- 1) * 28 + d.
Debido a que los dos elementos -7 y (M-1)*28 son divisibles por 7, si se eliminan estos dos elementos, el resto después de dividir W por 7 permanece sin cambios.
La fórmula queda:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] + d.
(5)
Por supuesto, cabe señalar que enero y febrero se han considerado como los meses 13 y 14 del año anterior, por lo que al calcular los días de enero y febrero
Además de que M se cuenta como 13 o 14, al año Y también se le resta uno. Por ejemplo, el 1 de enero de 2004 es jueves. Utilice esta fórmula para calcular:
W = (2003-1) + [(2003-1)/4] - [(2003-1)/100. ] + [(2003-1)/400] + [13*(13+1)/5]
+ 1
= 2002 + 500 - 20 + 5 + 36 + 1
= 2524
2524 / 7 = 360……4. Esto es consistente con la realidad.
La fórmula (5) ya es una fórmula para calcular el día de la semana a partir del año, mes y día, pero no es la más concisa y hay margen de mejora en el procesamiento de la método del año
. Primero usemos esta fórmula para calcular la semana del 1 de marzo del primer año de cada siglo. La lista es la siguiente:
Año: 1(401,801,…,2001) 101( 501,901,…,2101. )
---------------------------------------- -- -----------------------
Semana: 4 2
= == ================================================= == ===============
Año: 201(601,1001,…,2201) 301(701,1101,…,2301)
------------------------------------------------- - ---------------------
Semana: 0 5
Se puede observar que cada cuatro siglos, este Repetir una vez por semana.
Si consideramos 301(701,1101,…,2301)
El número de semana del 1 de marzo de 2019 es -2 (según la definición de resto en teoría de números, -2 y 5 dividido por 7. los restos son iguales, por lo que se puede hacer esta transformación), entonces esta secuencia repetida es exactamente una secuencia aritmética de 4,2,0,-2. En base a esto,
podemos obtener la siguiente fórmula para calcular el día de la semana del 1 de marzo del primer año de cada siglo:
W = (4 - C mod 4 ) * 2 - 4. (6)
En la fórmula, C es el número del siglo menos uno, y mod representa la operación de módulo, es decir, encontrar el resto. Por ejemplo, para marzo de 2001
1, C=20, entonces:
W = (4 - 20 mod 4) * 2 - 4
= 8 - 4
= 4.
Sustituyendo la fórmula (6) en la fórmula (5), después de la transformación, podemos obtener:
(Y-1) + [(Y-1)/4] - [( Y -1)/100] + [(Y-1)/400] ≡ (4 - C mod 4) * 2 - 1
(mod 7). (7)
Por lo tanto, (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1) en la fórmula (5) / 400]Estos cuatro elementos se pueden reemplazar por (4 - C mod 4) * 2 - 1 al calcular el día del primer año de cada siglo. Esta fórmula se escribe como:
W = (4 - C mod 4) * 2 - 1 + [13 * (M+1) / 5] + d. (8)
Con la fórmula para calcular la fecha y semana del primer año de cada siglo, la fórmula para calcular la fecha y semana de los demás años del siglo es fácil de obtener.
Porque en un siglo, el año que termina en 00 es el último año, por lo que no es necesario considerar la regla de "sin saltos en cien años y saltos en cuatrocientos años". cuatro saltos". Regla del "año bisiesto". Siguiendo el método de simplificar la fórmula (1)
en la fórmula (2), podemos obtener fácilmente un cálculo más simple de la fórmula (8) que de la fórmula (5)
La fórmula del día de la semana:
S = (4 - C mod 4) * 2 - 1 + (y-1) + [y/4] + [13 * (M+1) / 5] + d . (9)
En la fórmula, y son los dos últimos dígitos del año.
Si consideramos que la operación de módulo no son las cuatro operaciones aritméticas, podemos reescribir aún más (4 - C mod 4) * 2
en una expresión que contenga solo las cuatro operaciones aritméticas .
Porque existe la siguiente relación entre el cociente q y el resto r del siglo menos un C dividido por 4:
4q + r = C,
donde r es C mod 4 , Por lo tanto, existen:
r = C - 4q
= C - 4 * [C/4]. (10)
Entonces
(4 - C mod 4) * 2 = (4 - C + 4 * [C/4]) * 2
= 8 - 2C + 8 * [C/4]
≡ [C/4] - 2C + 1 (mod 7). (11)
Sustituyendo la ecuación (11) en (9), obtenemos:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1. (12)
Esta fórmula puede calcular W restando uno al siglo, los dos últimos dígitos del año, el mes y el día, y luego dividirlo entre 7. ¿Cuál es el resto?
p>
Este día es el día de la semana. El único cambio que es necesario realizar es tratar enero y febrero como los meses 13 y 14 del año anterior.
C e y son. ambos valorados según el año del año anterior. Por lo tanto, generalmente se considera la mejor fórmula para calcular el día de la semana para un día determinado. Esta fórmula fue deducida por primera vez por el matemático alemán Christian Zeller (1822-
1899) en 1886, por lo que se la conoce comúnmente como fórmula de Zeller. Para facilitar el cálculo oral,
[13 * (M+1) / 5] en la fórmula a menudo se escribe como [26 * (M+1) / 10].
Ahora calculemos todavía la semana del 1 de mayo de 2004. Obviamente C=20, y=4, M=5, d=1, sustituimos en la fórmula de Zeiler
, hay son:
W = [20/4] - 40 + 4 + 1 + [13 * (5+1) / 5] + 1 - 1
= -15.
Tenga en cuenta que el resto de un número negativo no se puede calcular según el concepto habitual de resto, sino que sólo se puede calcular según la definición de resto en la teoría de números. Para facilitar el cálculo, podemos sumarle un múltiplo entero de 7 para convertirlo en un número positivo, como sumar 70 para obtener 55.
Divídelo nuevamente entre 7 y el resto es 6, lo que indica que este día es sábado. Esto es consistente con la realidad y consistente con el resultado calculado por la fórmula (2)
.
Lo último que hay que tener en cuenta es que todas las fórmulas anteriores se basan en las reglas de salto del calendario gregoriano.
Para el calendario juliano, Zeiler también derivó la fórmula correspondiente:
W = 5 - C + y + [y/4] + [13 * (M+1) / 5] + d - 1. (13)
=========================================
(2005-10-20 22:25:00) --------(4575252)
Varios algoritmos para calcular el día de la semana para cualquier día
Recientemente, vi a alguien preguntando sobre el algoritmo semanal en el foro, lo resolví. Todos estos algoritmos fueron buscados en Internet y la implementación del algoritmo fue escrita por mí en el proyecto. Espero que ayude a todos.
1: Fórmulas de uso común
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y - 1)/400] + D
Y es el número de años, D es el número acumulado de días en este año, es decir, qué día es este día en este año.
Dos: Fórmula de Zeller
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d -1 p>
El significado de los símbolos en la fórmula es el siguiente, w: semana; c: siglo; y: año (dos dígitos); m: mes (m es mayor o igual a 3, menor o igual). a 14, es decir, en Zeiler En la fórmula, enero y febrero de un año determinado se calculan como los meses 13 y 14 del año anterior. Por ejemplo, el 1 de enero de 2003 se calcula como el 1 de marzo de 2002); día; [ ] representa redondeo, es decir, solo se requiere la parte entera.
En comparación con las fórmulas de cálculo de uso general, la fórmula de Zeller reduce en gran medida la complejidad de los cálculos.
Tres: Mejora de la fórmula de Zeller
Autor: Feng Sicong
En comparación con otra fórmula de cálculo de propósito general, Zeller (la fórmula de Zeller reduce en gran medida la complejidad computacional. Sin embargo, la fórmula de cálculo general proporcionada por el autor parece ser más concisa (incluido el proceso de cálculo). Ahora enumera la siguiente fórmula:
W=[y/4]+r (y/7)-2r(c/4)+m'+d
En la fórmula The símbolos de 6; (2', 3', 11') = 2; (4', 7') = 5; 5' = 0; 4 (Nota: en la fórmula dada por el autor, cuando y es el año de ejecución, 1'=5; 2'=1). Los demás símbolos tienen el mismo significado que en la fórmula de Zeller.
Cuatro: Fórmula de cálculo de Kim Larson
Le puse nombre a esta fórmula, jaja, espero que no te ofendas.
W= (d+2*m+3*(m+1)/5+y+y/4-y/10y/400) mod 7
pulgadas En la fórmula, d representa el número de días de la fecha, m representa el número de meses e y representa el número de años.
Nota: Existe una diferencia entre la fórmula y otras fórmulas:
Trate enero y febrero como los meses duodécimo y decimocuarto del año anterior, por ejemplo: Si es 2004- 1-10, conviértalo a: 2003-13-10 y sustitúyalo en el cálculo de la fórmula.