java - número - como saber si un año es bisiesto c++
Java dice que el año 0 es un año bisiesto pero el año 0 nunca existió (2)
Estaba escribiendo algunos casos de prueba para algunos métodos de conveniencia que estoy actualizando y decidí ver qué pasaría si usara el
LocalDate
isLeapYear()
en el año 0. Tal como lo entiendo, el año 0 nunca existió: el año anterior 1 AD fue 1 aC
(Esto se basa en un artículo que leí hace muchos años, cuya fuente olvidé hace tiempo). Para mi sorpresa, mi prueba indicó que el año 0 fue un año bisiesto.
Me doy cuenta de que la clase
java.time.LocalDate
implementa ISO-8601 pero, ¿indica realmente ISO-8601 que el año 0 existió?
Me resisto a creer que las personas que probaron
LocalDate
se hubieran perdido esto como un caso de prueba, pero también me resisto a creer que un estándar internacional como ISO-8601 cometería un error tan obvio.
La otra posibilidad es que el artículo que leí estaba completamente equivocado. (O fue correcto entonces, pero fue repensado más tarde).
Esto no es muy importante, pero tengo curiosidad por saber dónde está el error: ISO-8601, la clase
LocalDate
de Java, o mi comprensión de cómo se cuenta el tiempo.
De Wikipedia :
... hay un año cero en la numeración del año astronómico (donde coincide con el año Juliano 1 AC) y en ISO 8601: 2004 (donde coincide con el año Gregoriano 1 AC)
TL; DR:
LocalDate
está haciendo lo que está documentado para hacer, siguiendo un estándar internacional (ISO 8601).
Si esto es "correcto" o no es una pregunta completamente diferente.
El
LocalDate
Javadoc
LocalDate
incluye esta advertencia:
Es equivalente al proleptico sistema de calendario gregoriano, en el que las reglas de hoy para los años bisiestos se aplican en todo momento. Para la mayoría de las aplicaciones escritas hoy, las reglas ISO-8601 son totalmente adecuadas. Sin embargo, cualquier aplicación que haga uso de fechas históricas y requiera que sean precisas encontrará que el enfoque ISO-8601 no es adecuado.
Wikipedia tiene más información sobre el proleptico calendario gregoriano . Entre otras cosas, dice:
Matemáticamente, es más conveniente incluir un año 0 y representar los años anteriores como negativos, con el propósito específico de facilitar el cálculo del número de años entre un año negativo (BC) y un año positivo (AD). Esta es la convención utilizada en la numeración de años astronómicos y en el sistema internacional de fechas estándar, ISO 8601. En estos sistemas, el año 0 es un año bisiesto.
Perdóname un momento mientras me divago en algún contexto histórico por todo esto.
Los años en el calendario occidental son ostensiblemente contados desde el nacimiento de Jesucristo, pero la idea de hacerlo comenzó en el siglo VI y nuestro calendario actual se basa en cálculos realizados en el siglo XVI. Dado que los números romanos no tenían representación de cero ni de números negativos, los años se contaban "después de Jesús" (AD, por anno domini ) o "antes de Jesús" (BC, por "antes de Cristo"). Por lo tanto, tradicionalmente, 1 aC fue seguido por AD 1, sin año cero entre.
Sin embargo, en el primer siglo, nadie contaba los años de esa manera; para comparación, el Evangelio de Lucas describe el año en que Jesús comenzó su ministerio como
en el decimoquinto año del reinado de Tiberio César, Poncio Pilato fue gobernador de Judea, y Herodes fue tetrarca de Galilea, y su hermano Felipe, tetrarca de Ituraea y de la región de Trachonitis, y Lysanias, tetrarca de Abilena,
Aparentemente, esto habría sido el año 30 d. C., ya que Lucas describe a Jesús con "unos treinta años de edad" en ese momento. Pero los historiadores modernos generalmente están de acuerdo en que Dionysius Exiguus, quien propuso el sistema anno domini en el año 525 dC, se equivocó y, por lo tanto, la numeración de los años desaparece al menos uno o dos años. (La fecha exacta todavía es algo controvertida; consulte Wikipedia si le interesa más detalles).
Pero es demasiado tarde para arreglarlo ahora; incluso la transición del calendario juliano al gregoriano, que fue una discrepancia de menos de dos semanas, se encontró con una gran resistencia política, ya que el cambio se produjo en toda Europa durante un período de varios siglos; se puede imaginar lo perturbador que es un cambio en la numeración de años. sería ahora!
Entonces, ¿qué tiene que ver esta historia con el software de hoy? Desafortunadamente, debido a las innumerables formas en que se calcularon y anotaron las fechas a lo largo de la historia, debe abandonar el calendario comportándose de manera coherente a medida que avanza y retrocede en el tiempo, o debe abandonar las fechas calculadas tener correspondencia con las fechas que las personas reales habrían utilizado en ese momento. La divergencia ocurre más rápidamente de lo que podría pensar: ¡muchos países europeos seguían usando el calendario juliano hace menos de 100 años, con una discrepancia de casi dos semanas de todos los demás en Europa!
Comprensiblemente,
LocalDate
lava sus manos de este desastre y solo implementa el calendario de la forma en que lo usamos hoy.
Reiterando lo que dice el Javadoc:
"Para la mayoría de las aplicaciones escritas hoy, las reglas ISO-8601 son totalmente adecuadas. Sin embargo, cualquier aplicación que utilice fechas históricas y requiera que sean precisas encontrará que el enfoque ISO-8601 es inadecuado".