Java sagt, das Jahr 0 sei ein Schaltjahr, aber das Jahr 0 habe es nie gegeben

74

Ich habe einige Testfälle für einige bequemen Methoden schreiben , dass ich die Aktualisierung und beschlossen , zu sehen , was passieren würde , wenn ich verwende LocalDate‚s - isLeapYear()Methode für das Jahr 0. Wie ich es verstehe, Jahr 0 nie existiert: das Jahr vor dem 1. AD 1 war BC. (Dies basiert auf einem Artikel, den ich vor vielen Jahren gelesen habe und dessen Quelle ich längst vergessen habe.) Zu meiner großen Überraschung ergab mein Test, dass das Jahr 0 ein Schaltjahr war!

Mir ist klar, dass die java.time.LocalDateKlasse ISO-8601 implementiert, aber zeigt ISO-8601 wirklich an, dass das Jahr 0 existiert hat? Ich zögere zu glauben, dass die LocalDateTestpersonen dies als Testfall verpasst hätten, aber ich zögere auch zu glauben, dass ein internationaler Standard wie ISO-8601 einen so offensichtlichen Fehler machen würde.

Die andere Möglichkeit ist, dass der Artikel, den ich gelesen habe, einfach falsch war. (Oder es war damals richtig, wurde aber später überdacht.)

Dies ist nicht sehr wichtig, aber ich bin gespannt, wo der Fehler liegt: ISO-8601, Javas LocalDateKlasse oder mein Verständnis, wie viel Zeit berechnet wird.

Henry
quelle
1
Vielen Dank an alle! Ich bin froh zu sehen, dass LocalDate keinen offensichtlichen Fehler enthält. Ich werde mich daran gewöhnen müssen, wieder an eine Zeitachse wie ein Thermometer mit negativen, null und positiven Werten zu denken ...
Henry
3
Tatsächlich ist das eigentliche Problem, dass Kalendersysteme historisch inkonsistent waren. Sie können den modernen Kalender verwenden, um über Daten in der beliebigen Vergangenheit zu sprechen. Wenn Sie jedoch Daten in der beliebigen Vergangenheit lesen oder berechnete Daten mit beliebigen historischen Ereignissen abgleichen möchten , wird das Problem schnell nicht nur schwierig, sondern für viele Daten effektiv unmöglich. Die Idee des "Jahres Null" ist eine moderne Erfindung, für unsere eigene Bequemlichkeit. Menschen, die zum Zeitpunkt des Jahres Null (oder eines BCE oder wie auch immer Sie es schreiben) lebten, hätten nicht gewusst, dass etwas Bedeutendes passiert war.
Daniel Pryden
Daniel Pryden - Ja, ich bin mir einiger der vielen Herausforderungen im Zusammenhang mit der Zeitmessung bewusst . Mir war nur nicht bewusst, dass ein Jahr 0 erfunden wurde, um die Berechnungen zu vereinfachen. ;-)
Henry

Antworten:

107

TL; DR: LocalDatetut, was dokumentiert ist, gemäß einer internationalen Norm (ISO 8601). Ob dies "richtig" ist oder nicht, ist eine ganz andere Frage.

Der LocalDateJavadoc selbst enthält diese Einschränkung:

Es entspricht dem proleptischen gregorianischen Kalendersystem, in dem die heutigen Regeln für Schaltjahre für alle Zeiten angewendet werden. Für die meisten heute geschriebenen Anwendungen sind die ISO-8601-Regeln völlig geeignet. Für jede Anwendung, die historische Daten verwendet und deren Genauigkeit erfordert, ist der ISO-8601-Ansatz jedoch ungeeignet.

Wikipedia hat weitere Informationen zum proleptischen Gregorianischen Kalender . Unter anderem heißt es:

Mathematisch ist es bequemer, ein Jahr 0 einzuschließen und frühere Jahre als negativ darzustellen, um die Berechnung der Anzahl der Jahre zwischen einem negativen (BC) Jahr und einem positiven (AD) Jahr zu erleichtern. Dies ist die Konvention, die bei der astronomischen Jahresnummerierung und im internationalen Standarddatumsystem ISO 8601 verwendet wird. In diesen Systemen ist das Jahr 0 ein Schaltjahr.

Verzeihen Sie mir einen Moment, während ich in einen historischen Kontext für all dies eintauche.

Die Jahre im westlichen Kalender werden angeblich ab der Geburt Jesu Christi gezählt, aber die Idee dazu begann im sechsten Jahrhundert, und unser aktueller Kalender basiert auf Berechnungen aus dem sechzehnten Jahrhundert. Da römische Ziffern weder Null noch negative Zahlen darstellten, wurden die Jahre entweder "nach Jesus" (n. Chr. Für anno domini ) oder "vor Jesus" (v. Chr. Für "vor Christus") gezählt. So folgte traditionell 1 v. Chr. 1 n. Chr. Ohne Jahr Null dazwischen.

Im ersten Jahrhundert zählte jedoch niemand Jahre so; Zum Vergleich beschreibt das Lukasevangelium das Jahr, in dem Jesus seinen Dienst begann, als

im fünfzehnten Regierungsjahr von Tiberius Cäsar war Pontius Pilatus Gouverneur von Judäa, Herodes Tetrarch von Galiläa und sein Bruder Philip Tetrarch von Ituraea und der Region Trachonitis sowie Lysanias der Tetrarch von Abilene.

Angeblich wäre dies 30 n. Chr. Gewesen, da Lukas Jesus damals als "ungefähr dreißig Jahre alt" beschreibt. Moderne Historiker sind sich jedoch im Allgemeinen einig, dass Dionysius Exiguus, der 525 n. Chr. Das Anno-Domini- System vorschlug , es falsch verstanden hat und daher die Anzahl der Jahre um mindestens ein oder zwei Jahre abweicht. (Das genaue Datum ist immer noch etwas umstritten. Weitere Informationen finden Sie in Wikipedia .)

Aber es ist zu spät, um es jetzt zu reparieren. Selbst der Übergang vom julianischen zum gregorianischen Kalender, der eine Diskrepanz von weniger als zwei Wochen darstellte, stieß auf großen politischen Widerstand, als die Umstellung in ganz Europa über einen Zeitraum von mehreren Jahrhunderten erfolgte - Sie können sich vorstellen, wie störend eine Änderung der Jahresnummerierung war wäre jetzt!

Was hat diese Geschichte heute mit Software zu tun? Leider müssen Sie aufgrund der unzähligen Methoden, mit denen Daten im Laufe der Geschichte berechnet und niedergeschrieben wurden, entweder auf den Kalender verzichten, der sich konsistent verhält, wenn Sie sich in der Zeit vorwärts und rückwärts bewegen, oder Sie müssen auf berechnete Daten verzichten Korrespondenz mit den Daten, die echte Menschen zu diesem Zeitpunkt verwendet hätten. Die Abweichung geschieht schneller als Sie vielleicht denken: Viele europäische Länder haben den julianischen Kalender noch vor weniger als 100 Jahren verwendet, mit einer Abweichung von fast zwei Wochen von allen anderen in Europa!


Verständlicherweise LocalDatewäscht er seine Hände von diesem Durcheinander und implementiert den Kalender nur so, wie wir ihn heute verwenden. Wiederholen, was der Javadoc sagt: "Für die meisten heute geschriebenen Anwendungen sind die ISO-8601-Regeln völlig geeignet. Für jede Anwendung, die historische Daten verwendet und deren Genauigkeit erfordert, ist der ISO-8601-Ansatz jedoch ungeeignet."

Daniel Pryden
quelle
11
Gut zu wissen, dass sie über ihre Grenzen Bescheid wissen. Schöner Fund.
Alain Cruz
6
Obligatorisches Tom Scott Video zu diesem Thema: youtube.com/watch?v=-5wpm-gesOY
Dan
3
Die Geschichte der Zeitmessung ist faszinierend. Eine Anekdote, die ich las, besagt, dass als Napoleon die Geißel Europas war, die Russen und die Deutschen (oder Engländer?) Vertreter hatten und sich bereit erklärten, ihre verschiedenen Armeen an einem bestimmten Ort zu einem bestimmten Zeitpunkt zu treffen. (Ich erinnere mich weder an das Datum noch an den Ort.) Jede Armee mit Ausnahme der Russen erschien zum festgelegten Datum: Dieses Datum war noch fast zwei Wochen in der Zukunft und sie marschierten immer noch ... Die Alliierten vergaßen, dass die Die Russen benutzten immer noch den julianischen Kalender, während die anderen den gregorianischen Kalender benutzten.
Henry
1
@ Henry so wahr. Und etwas, das auf den ersten Blick für die Menschen so "offensichtlich" ist, wird zum Albtraum, in eine Bibliothek zu programmieren. Und auch pflegen! (Hey, lass uns aufhören, die Sommerzeit in unserem Land zu nutzen! Hey, lass uns am letzten Tag dieses Jahres eine Sekunde hinzufügen!)
Pac0
1
Ähnliche Einschränkungen gelten GregorianCalendar: " GregorianCalendarGeräte proleptische . Gregorian und Julian Kalender Das heißt, Daten durch Extrapolation der aktuellen Regeln auf unbestimmte Zeit weit rückwärts berechnet werden und vorwärts in der Zeit ... aber Daten erhalten werden. GregorianCalendarHistorisch korrekt sind erst ab 1. März, 4 AD weiter, Als moderne julianische Kalenderregeln verabschiedet wurden. Vor diesem Datum wurden die Regeln für Schaltjahre unregelmäßig angewendet ... "
200_Erfolg
10

Aus Wikipedia :

... gibt es ein Jahr Null in der astronomischen Jahresnummerierung (wo es mit dem julianischen Jahr 1 v. Chr. übereinstimmt) und in ISO 8601: 2004 (wo es mit dem gregorianischen Jahr 1 v. Chr. übereinstimmt)

Alex Taylor
quelle
Hinweis: Der Neujahrstag war früher der 25. März, hatte aber etwas mehr Tage, sodass die Jahre so aufeinander abgestimmt waren, dass er nach dem Gregorianischen Kalender näher am 12. März gelegen hätte.
Peter Lawrey