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.LocalDate
Klasse ISO-8601 implementiert, aber zeigt ISO-8601 wirklich an, dass das Jahr 0 existiert hat? Ich zögere zu glauben, dass die LocalDate
Testpersonen 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 LocalDate
Klasse oder mein Verständnis, wie viel Zeit berechnet wird.
Antworten:
TL; DR:
LocalDate
tut, was dokumentiert ist, gemäß einer internationalen Norm (ISO 8601). Ob dies "richtig" ist oder nicht, ist eine ganz andere Frage.Der
LocalDate
Javadoc selbst enthält diese Einschränkung:Wikipedia hat weitere Informationen zum proleptischen Gregorianischen Kalender . Unter anderem heißt es:
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
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
LocalDate
wä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."quelle
GregorianCalendar
: "GregorianCalendar
Gerä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.GregorianCalendar
Historisch 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 ... "Aus Wikipedia :
quelle