Ideas de programación del calendario perpetuo
Por último, adjunte una copia... conozca la dirección de mi respuesta anterior.
/question/9433604.html
Un calendario perpetuo, pero no un calendario lunar.
¿Cómo calcular el día de la semana?
Publicado el 11-10-2005 21:43:00.
¿Cómo calcular el día de la semana?
-Fórmula de Zeller
¿Qué es un día determinado en la historia? ¿Qué día es el futuro? Hay muchas fórmulas para este problema (dos fórmulas generales y algunas fórmulas 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.
Los símbolos en la fórmula tienen los siguientes significados: w: semana; c: siglo-1; y: año (dos dígitos); m: mes (m es mayor o igual a 3, pero menor); mayor o igual a 14, es decir, en la fórmula de Chuler el 1 y febrero de un año deben considerarse como 13, y el 14 del año anterior. Por ejemplo, 1 en 2003 debe considerarse como 1 en 2002. d: día. ; [] representa redondeo, es decir, tomar solo 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.
65438+ octubre y febrero deben calcularse como 65438+ del año anterior Calculado en marzo y 65438+abril, C e Y se calculan en función del 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 65438 + 1 de octubre de 2049 (el centenario del Día Nacional). A modo de ejemplo, 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 entre 7 y 5)
Es decir, el 10 de junio de 2049 (100.º Día Nacional) es viernes.
¿Cuándo es tu cumpleaños? ¿Cuándo naciste, este año, el año que viene? /p>
Pero la fórmula anterior solo se aplica a la situación posterior al 15 de octubre de 1582 (cuando el Papa cambió el calendario juliano establecido por Julio César. Es el calendario gregoriano, que es el calendario gregoriano que se usa hoy)
Deducción del proceso: (Aquellos que no estén interesados en el razonamiento pueden omitirlo)
El sistema semanal es un sistema con una tradición antigua. Se dice que porque el Génesis de la Biblia estipula que Dios lo usó. seis días para la creación, y el séptimo día es un día de descanso, por lo que la gente organiza su trabajo y su vida en un ciclo de siete días.
En vivo, el domingo es un día libre. también es apropiado utilizar un ciclo de siete días.
Aunque el ciclo de trabajo tradicional chino es de diez días (como en el "Prefacio a Wang Tengting" de Wang Bo), lo que significa "Diez días libres". (que los funcionarios trabajan en un ciclo de diez días y descansan el décimo día), pero más tarde también se adoptó el sistema Zhou occidental.
En la vida diaria, muchas veces nos encontramos con el problema de saber qué día es. A veces, también queremos saber
¿Qué día de la semana es un día determinado en la historia del taoísmo? Normalmente, la forma eficaz de solucionar este problema es mirar el calendario, pero nunca lo hacemos.
Lleva contigo un calendario, y mucho menos un calendario de mil años. Si quieres iniciarte en la programación informática
Calcular los días de la semana por adelantado, almacenar un calendario perpetuo es aún menos práctico. ¿Hay alguna manera de superarlo en este momento?
¿Qué fórmula pasaste? ¿Qué día es hoy?
La respuesta es sí. De hecho, hacemos esto con bastante frecuencia. Primero tomemos un ejemplo simple. Por ejemplo, ¿lo sabías?
Dado que el 1 de mayo de 2004 es sábado, no es difícil calcular que el 31 de mayo de 2004 es el Día Mundial Sin Tabaco.
Vamos. Podemos contar del 1 al 31, contando las semanas al mismo tiempo, y finalmente deducir que el 31 de mayo es lunes.
De hecho, puedes utilizar cálculos matemáticos sin romperte los dedos. Sabemos que una semana es un ciclo de siete días, por eso el 1 de mayo es una estrella.
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 igual forma, el 15 de mayo
22 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.
Es múltiplo 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.
En otras palabras, la semana del 31 de mayo es dos días después de la semana del 1 de mayo. Dos días después del sábado es lunes.
Este sencillo cálculo nos da una idea básica para calcular la semana: En primer lugar debemos saber los días a calcular.
¿Qué día de la semana fue el día anterior? Usar este día como estándar de cálculo equivale a un cálculo.
"Origen" En segundo lugar, sé cuántos días hay entre la fecha que quiero calcular y esta fecha determinada, divida esta fecha entre 7.
El resto representa el día siguiente a la semana a calcular. Si el resto es
0, significa que los dos días de la semana son iguales. Obviamente, si se elige el domingo como día de "origen", entonces el resto es exactamente igual al día de la semana, por lo que el cálculo es más conveniente.
Pero sigue siendo relativamente engorroso calcular directamente el número de días entre dos días. Por ejemplo, 29 de julio de 1982, mayo de 2004.
El intervalo entre un día es de 7947 días, que no se pueden calcular de una vez. Incluye tres periodos: 1, 29 de julio de 1982.
Los días restantes del año posterior a la fecha; 2. 1983-2003, todos los días del vigésimo primer año 3. a partir de 2004
Día de Año Nuevo hasta el número de mayo; de los días 1. El segundo párrafo es más fácil de calcular. Igual a 21 * 365+5 = 7670 días. El motivo para agregarlo es.
5, porque en este periodo hay cinco años bisiestos. El primer y tercer párrafo son más problemáticos. Por ejemplo, en el tercer párrafo, debe agregar el número de días en los primeros cuatro meses de mayo y agregar el valor de la fecha, es decir, 31+29+31+3 1. = 122 días. De manera similar, el primer período
necesita sumar el número de días de los cinco meses posteriores a julio, más los días restantes de julio, para un total de 155 días.
Entonces, el número total de días de diferencia es 122+767155=7947 días.
Piénselo detenidamente, si elige la fecha de "origen" como 65438+31 de febrero, entonces el primer período también es 1.
Para todo el año, de esta forma, se pueden combinar el primer y segundo período, y el total para todo el año es exactamente igual a dos.
La diferencia de año entre dos fechas se reduce en uno. Si se elige además que la fecha de "origen" sea el 1 de febrero de 65438 a. C. + 31 de febrero (o astronomía, el total para todo el año es exactamente el año del día que desea calcular menos uno, los científicos usan 0 de febrero Como 65438+31 Después de simplificar la muestra, solo necesita calcular dos períodos de tiempo: uno es el número total de días en todo el año; el segundo, el día que desea contar es este día
<. p>¿Qué día del año? Casualmente, según la configuración de año y mes del calendario gregoriano, este resulta ser 1 65438 a.C. + 31 de febrero.Es decir, siempre. el número de días dividido por 7 es exactamente el día de la semana entonces la pregunta ahora es: ¿cuántos años bisiestos hay en tantos años enteros?
Sabemos que es el año promedio del calendario gregoriano. es de 365 días y el año bisiesto es de 366 días. El método para establecer los años bisiestos es agregar un día en febrero para los años divisibles por 4, pero no para los años bisiestos que son divisibles por 100. Los años bisiestos son divisibles por 400. Entonces, como 1600, 2000, 2400.
Cada año es bisiesto, y 1700, 1800, 1900 y 2100 son todos años normales. Según el calendario gregoriano, el año 1 a.C. también es bisiesto. /p>
Por lo tanto, para todos los años desde el 1 a.C. (o 0 d.C.) 12 31 hasta una determinada fecha del año Y
El número de años bisiestos es igual a
<. p>[(Y-1)/4]-[(Y-1)/100]+[(Y-1)/400],[...] significa tomar solo la parte entera El primer elemento indica que se debe sumar el número de años divisible por 4 y el segundo indica que se debe eliminar.
El número de años divisible por 100, el tercer elemento indica que es necesario sumar el número de años divisible por 400. La razón por la que y debería reducirse en 1 es que
En el ejemplo, obtenemos la primera fórmula para calcular el día de la semana:
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 en este día en un año. La W calculada es 65438 + 0 aC (o 0 dC) 65438 + febrero.
El número de días entre 31 y hoy. Divida w entre 7, cuál es el resto, este día es el día de la semana. Por ejemplo,
calculemos 1 en 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 6, lo que indica que este día es sábado. Esto es cierto.
Aunque la fórmula anterior (1) es muy precisa, el número calculado es demasiado grande y resulta incómodo de usar. Jóvenes
Piensan detenidamente. De hecho, la cantidad de días w solo se usa para obtener el resto después de dividir por 7. Esto nos inspiró
No podemos simplificar este valor de w, simplemente encontrar un número más pequeño con el mismo resto, usando la terminología de la teoría de números.
En general, incluso si encuentras un número entero positivo más pequeño que sea congruente, aún puedes 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
El resto es igual a Y-1 dividido por 7. Esta relación se puede expresar como:
(Y-1)*365 ≡ Y-1 (mod 7).
Donde ≡ es el símbolo de congruencia en la teoría de números, mod 7 significa usar 7 como módulo (es decir, divisor).
En este caso, los números a ambos lados del signo ≡ son congruentes. Por tanto, (Y-1) se puede sustituir por (Y-1)*365, de forma que obtenemos
Presentamos la famosa y más común fórmula para calcular los días 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 mejor fórmula porque el cálculo del número acumulado de días D también es relativamente entumecido.
Molesto. ¿Es posible calcular directamente usando mes y fecha? La respuesta también es sí. Echemos un vistazo a cada uno
El número de días en un mes es el siguiente:
Mes: 65438 + febrero, marzo, abril, mayo, julio, agosto Mes, septiembre, 65438+octubre, 65438+octubre, 65438+febrero.
-
Número de días: 31 28(29)31 30 31 30 31 31 30 31.
Si restas 28 (=4*7) a todos estos días, no afectará al resto de W dividido por 7. Entonces podemos comprar otro.
Tabla:
Mes: 65438+febrero, marzo, abril, mayo, julio, agosto, septiembre, 65438+octubre, 65438+octubre, 65438+ febrero.
-
Número de días restantes: 30 (1) 323232323
Acumulación anual promedio: 3 368 11 13 16 19 21 24 26 29.
El número total de años bisiestos: 3 479 12 14 17 20 22 25 27 30
Si observamos con atención, encontraremos que en los cinco meses de marzo a julio, excepto para enero y febrero, el resto de días son 3, 2, 3, 2.
3;El número de días en los cinco meses desde agosto hasta 65438+2 también es 3, 2, 3, 2, 3, es solo una repetición. En los días acumulados correspondientes,
La diferencia entre los días acumulados del último mes y los días acumulados del último mes menos 28 es esta repetición. Es precisamente por esta regla
que el número acumulado de días en años ordinarios y bisiestos se puede expresar fácilmente con una fórmula matemática:
╭d (cuando m = 1; )
p>d = { 31+d; (cuando m = 2)(3)
╰[13 *(M+1)/5]-7+(M -1)* 28+d+I .(M≥3)
Donde [...] todavía significa tomar solo la parte entera; m y d son el mes y el día a calcular respectivamente; año promedio i=0, año bisiesto
i=1 La expresión M≥3 debe explicarse: [13*(M+1)/5]-7 se calcula en la Tabla 2 anterior.
El valor promedio acumulado más (M-1)*28 es el número total de días en todos los meses anteriores al mes a calcular. Este es un método muy inteligente de utilizar operaciones con números enteros para implementar un bucle 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 el número acumulado de días el 1 de mayo de 2004.
Si hacemos un cambio y consideramos 65438+octubre y febrero como "65438+marzo" y "65438+abril" del año anterior, no sólo siguen estando
Sin embargo, se ajusta a la fórmula y, debido a esto, el día bisiesto se convierte en el último día del último "año" (14 meses en total)
El día bisiesto se ha convertido en parte de D, por lo que el impacto del año bisiesto promedio ha sido Eliminado, la fórmula se simplifica a:
d =[13 *(M+1)/5]-7+(M-1)* 28+d .(3≤M ≤14)(4)
La fórmula anterior para calcular el día de la semana se puede simplificar aún más como:
w =(Y-1)+[(Y-1) /4]-[(Y-1)/100 ]+[(Y-1)/400]+[13 *(M+1)/5]-7
+ (M-1) * 28 + d.
Debido a que -7 y (M-1)*28 son divisibles por 7, si se eliminan estos dos elementos, el resto de W dividido 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 65438+octubre y febrero se han considerado como 65438+marzo y 65438+abril del año anterior, por lo que calcula 65438 + el número de días de octubre y febrero.
Una semana, excepto m, se calcula como 13 o 14, y el año y también se resta en uno. Por ejemplo, junio de 2004 65438 + 1 de octubre es jueves, así que utilice esto.
Una 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 p>
= 2524;
2524/7 = 360 ...4. Esto es realista.
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. Este año,
Hay algunas formas de mejorar el manejo de copias.
Usemos esta fórmula para calcular la semana 1 de marzo del primer año de cada siglo y enumeremos
La tabla es la siguiente:
Año: 1 (401, 801,… , 2001)101(501,901,…,265438+.
-
Semana 4 2
========== === ================================================ === =====
Año: 201 (601, 1001,…, 2201) 301 (701, 11065438)
-
Semana: 0 5
Como ves, esta semana se repite cada cuatro siglos si sumamos 301 (701, 1101,…, 2301).
El número se considera -2 (según el). definición de resto en teoría de números, -2 es lo mismo que el resto de dividir 5 entre 7, por lo que puedes hacer tal transformación), entonces esta secuencia repetida resulta ser 4, 2, 0, -2 secuencia aritmética.
calculamos la semana del 1 de marzo del primer año de cada siglo, y podemos obtener la siguiente fórmula:
W = (4 - C módulo 4) * 2 - 4 (6)
Donde c es el número de siglo menos uno y mod representa la operación de módulo, es decir, el resto. Por ejemplo, para marzo de 2006, 5438+0
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). , (y-1)+[(y-1)/4]-[(y-1)/100]+[(y-1)/400) en la fórmula (5).
El día de la semana del primer año de cada siglo se puede sustituir por (4-C mod 4)*2-1. Esta fórmula se escribe
El resultado es:
w =(4-C mod 4)* 2-1+[13 *(M+1)/5]+d. (8)
Utilice la fórmula para calcular la fecha y el día de la semana en el primer año de cada siglo, y la fórmula para calcular la fecha y la semana de la semana en otros años del siglo.
Fácil de conseguir. Porque en un siglo, el año que termina en 00 es el último año, por lo que no es necesario volver a realizar la prueba.
Considerando la ley del "salto de cien años, salto de cuatrocientos años", sólo necesitamos considerar la ley del "salto de cuatro años". Simular (1) con fórmula
Reduciendo este método a la fórmula (2), podemos obtener fácilmente cualquier cálculo de la fórmula (8) que sea más simple que la fórmula (5).
Un día es la fórmula del día de la semana:
w =(4-C mod 4)* 2-1+(y-1)+[y/4]+ [ 13 *(M+1)/5]+d .(9)
Donde y son los dos últimos dígitos del año.
Si consideramos que la aritmética modular no es aritmética, podemos reescribir aún más (4-C mod 4) * 2.
Convertir a una expresión que contenga sólo cuatro operaciones. Porque existe la siguiente relación entre el cociente de siglo q menos uno c dividido por cuatro y el resto r:
4q + r = C,
donde r es C mod 4, por lo tanto , existe :
r = C - 4q
= C - 4 * [C/4]. (10)
Reglas
(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 fórmula (11) en (9), obtenemos:
w =[C/4]-2C+y+[y/4]+[13 * (M+1)/5]+d-1. (12)
Esta fórmula se puede calcular restando 1 al siglo, los dos últimos dígitos del año, el mes y el día, y luego dividiendo por 7, quedando el resto
Algunos indican qué días son, lo único que hay que cambiar es tratar 65438+octubre y febrero como 65438+marzo y 65438+abril del año anterior.
Tanto c como y se basan en el año del año anterior. Por lo tanto, esta generalmente se considera la mejor manera de calcular el día de la semana para un día determinado.
Fórmula. Esta fórmula fue propuesta por primera vez por el matemático alemán Christian Zeller (1822 -
1899) y derivada en 1886, por lo que se la conoce comúnmente como fórmula de Zeller. Para facilitar los cálculos verbales,
donde [13 * (M+1)/5] a menudo se escribe como [26 * (M+1)/10].
Ahora contemos la semana del 1 de mayo de 2004. Obviamente, C=20, y=4, M=5, d=1, sustitúyelo en Lecai.
La fórmula incluye:
w =[20/4]-44+1+[13 *(5+1)/5]+1-1
= -15.
Tenga en cuenta que los números negativos no se pueden calcular según el concepto habitual de resto, sino que solo se pueden calcular según la definición de resto en la teoría de números. Por conveniencia
Para calcular, podemos sumar un múltiplo entero de 7 para convertirlo en un número positivo, por ejemplo, sumar 70 para obtener 55.
Dividido entre 7, los 6 restantes significan que este día es sábado. Esto es consistente con la realidad y también con los resultados calculados por la fórmula (2).
Los frutos son consistentes.
Por último, cabe señalar que las fórmulas anteriores se basan en la ley de salto del calendario gregoriano.
Sí. Para el calendario juliano, Lecai también introdujo 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 de Zhou en el foro, así que lo resolví. Todos estos algoritmos se buscaron en Internet y yo escribí la implementación de los algoritmos 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 de este año, es decir, ¿qué día es este año este año?
Dos: la fórmula de Zeller.
w = y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
Los símbolos en la fórmula son como sigue Significado: w: semana; c: siglo; y: año (dos dígitos); m: mes (m es mayor o igual a 3, pero menor o igual a 14, es decir, en la fórmula de Chuler, 1 y Febrero del año debe considerarse como 13, 14 en el año anterior, por ejemplo, 1 en 2003 debe considerarse como 1 en 2002. d: día [] representa redondeo, es decir, solo se toma la parte entera.
En comparación con la fórmula de cálculo general, la complejidad del cálculo se reduce considerablemente con la fórmula de Zeller.
En tercer lugar, la mejora de la fórmula de Zeller
Autor: Feng Siyuan
En comparación con otra fórmula general, la fórmula de Zeller reduce en gran medida la complejidad del cálculo, pero la fórmula de cálculo general proporcionada por el autor parece ser más concisa (incluido el proceso de cálculo).
Ahora la fórmula se ve así:
W=[y/4]+r (y/7)-2r(c/4)+m'+d
Símbolos en el fórmula Tiene el siguiente significado: r() representa el resto, es decir, solo la parte restante m ' es el número de corrección de m. Ahora damos el número de corrección de 1 a 12 ' de la siguiente manera: (1 ', 10. ') = 6 ;(2',3',11')=2;(4',7')=5;5'=0;6'=3;8'=1;(9',12') =4(Nota: En la fórmula dada por el autor, cuando el año corre, y es 1' = 5; 2'=1). Los demás símbolos tienen el mismo significado que los de la fórmula de Zeller.
Cuatro: la fórmula de cálculo de Kim Larson
Le di un 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
En 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: Esta fórmula se diferencia de otras fórmulas:
Piense en enero y febrero como los meses 13 y 14 del año anterior. Por ejemplo, si es 2004-1-10, conviértalo a: 2003-13-10 y sustitúyalo en la fórmula de cálculo.