Java sagt, dass das Jahr 0 ein Schaltjahr ist, aber das Jahr 0 hat nie existiert

Lesezeit: 7 Minuten

Benutzer-Avatar
Henry

Ich habe einige Testfälle für einige praktische Methoden geschrieben, die ich aktualisiere, und beschlossen, zu sehen, was passieren würde, wenn ich sie verwenden würde LocalDate‘s isLeapYear() Methode auf das Jahr 0. So wie ich es verstehe, hat das Jahr 0 nie wirklich existiert: Das Jahr vor 1 n. Chr. War 1 v. (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 implementiert ISO-8601, aber zeigt ISO-8601 wirklich an, dass das Jahr 0 existierte? Ich möchte nur ungern glauben, dass die Leute, die getestet haben LocalDate hätte dies als Testfall verpasst, aber ich möchte auch nicht 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, schlichtweg falsch war. (Oder es war damals richtig, wurde aber später überdacht.)

Dies ist nicht sehr wichtig, aber ich bin neugierig zu wissen, wo der Fehler liegt: ISO-8601, Java LocalDate Klasse, oder mein Verständnis davon, wie Zeit berechnet wird.

  • Danke, alle! Ich bin froh zu sehen, dass LocalDate keinen offensichtlichen Fehler enthält. Ich werde mich wieder daran gewöhnen müssen, mir eine Zeitleiste wie ein Thermometer mit negativen, null und positiven Werten vorzustellen….

    – Henry

    22. Oktober 2018 um 2:11 Uhr

  • Tatsächlich besteht das eigentliche Problem darin, dass Kalendersysteme historisch gesehen inkonsistent waren. Sie können den modernen Kalender verwenden, um über Daten in der willkürlichen Vergangenheit zu sprechen, aber wenn Sie möchten lesen Daten in der willkürlichen Vergangenheit oder berechnete Daten mit beliebigen historischen Ereignissen in Einklang bringen, wird das Problem schnell nicht nur schwierig, sondern für viele Daten praktisch unmöglich. Die Idee vom „Jahr Null“ ist eine moderne Erfindung, zu unserer eigenen Bequemlichkeit. Menschen, die zur Zeit des Jahres Null (oder eines v. Chr. oder wie auch immer Sie es schreiben) lebten, hätten nicht gewusst, dass etwas Bedeutendes passiert ist.

    – Daniel Priden

    22. Oktober 2018 um 9:37 Uhr


  • Daniel Pryden – Ja, ich kenne einige davon viele Herausforderungen rund um die Zeiterfassung. Mir war nur nicht bewusst, dass ein Jahr 0 erfunden wurde, um Berechnungen zu vereinfachen. 😉

    – Henry

    22. Oktober 2018 um 16:26 Uhr

Benutzer-Avatar
Daniel Priden

TL;DR: LocalDate tut, wofür es dokumentiert ist, gemäß einem internationalen Standard (ISO 8601). Ob das “richtig” ist oder nicht, ist eine ganz andere Frage.

Das LocalDate Javadoc selbst enthält diese Einschränkung:

Es entspricht dem proleptischen gregorianischen Kalendersystem, in dem die heutigen Regeln für Schaltjahre für alle Zeiten gelten. Für die meisten heute geschriebenen Anwendungen sind die ISO-8601-Regeln vollkommen geeignet. Jedoch wird der ISO-8601-Ansatz für jede Anwendung, die historische Daten verwendet und deren Genauigkeit erfordert, ungeeignet sein.

Wikipedia hat mehr Informationen über die proleptischer Gregorianischer Kalender. Dort heißt es unter anderem:

Mathematisch ist es bequemer, ein Jahr 0 einzubeziehen und frühere Jahre als negativ darzustellen, um die Berechnung der Anzahl von Jahren zwischen einem negativen (BC) Jahr und einem positiven (AD) Jahr zu erleichtern. Dies ist die Konvention, die bei der astronomischen Jahreszählung und im internationalen Standarddatumssystem 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 abschweife.

Die Jahre im westlichen Kalender werden angeblich ab der Geburt Jesu Christi gezählt, aber die Idee dazu begann im sechsten Jahrhundert, und unser heutiger Kalender basiert auf Berechnungen aus dem sechzehnten Jahrhundert. Da römische Zahlen weder Null noch negative Zahlen enthielten, wurden die Jahre entweder „nach Jesus“ (n. Chr., z Anno Domini) oder „vor Jesus“ (BC, für „vor Christus“). So folgte traditionell auf 1 v. Chr. 1 n. Chr., ohne das Jahr Null dazwischen.

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

im fünfzehnten Regierungsjahr des Kaisers Tiberius, als Pontius Pilatus Statthalter in Judäa und Herodes als Tetrarchen von Galiläa und sein Bruder Philipp als Tetrarchen von Ituräa und der Gegend von Trachonitis und Lysanias als Tetrarchen von Abilene,

Angeblich wäre dies das Jahr 30 n. Chr. gewesen, da Lukas Jesus als damals „ungefähr dreißig Jahre alt“ beschreibt. Aber moderne Historiker sind sich im Allgemeinen einig, dass Dionysius Exiguus, der die vorgeschlagen hat Anno Domini System im Jahr 525 n. Chr. falsch, und daher weicht die Nummerierung der Jahre um mindestens ein oder zwei Jahre ab. (Das genaue Datum ist noch etwas umstritten; vgl Wikipedia wenn Sie sich für mehr Details interessieren.)

Aber es ist zu spät, um es jetzt zu beheben; selbst der Übergang vom julianischen zum gregorianischen Kalender, der eine Diskrepanz von weniger als zwei Wochen bedeutete, stieß auf erheblichen politischen Widerstand, da sich die Umstellung in ganz Europa über mehrere Jahrhunderte erstreckte – Sie können sich vorstellen, wie störend eine Änderung der Jahreszahlen war wäre jetzt!

Was hat diese Geschichte also mit Software heute zu tun? Aufgrund der unzähligen Arten, wie Daten im Laufe der Geschichte berechnet und aufgeschrieben wurden, müssen Sie leider entweder auf ein konsistentes Verhalten des Kalenders verzichten, wenn Sie sich in der Zeit vorwärts und rückwärts bewegen, oder Sie müssen berechnete Daten aufgeben jede Korrespondenz zu den Daten zu haben, die echte Menschen zu dieser Zeit verwendet hätten. Die Abweichung geschieht schneller, als Sie vielleicht denken: Viele europäische Länder verwendeten vor weniger als 100 Jahren noch den Julianischen Kalender, mit einer Abweichung von fast zwei Wochen von allen anderen in Europa!


Verständlicherweise, LocalDate wäscht sich aus diesem Schlamassel die Hände und setzt den Kalender nur noch so um, wie wir ihn heute nutzen. Wiederholen, was das Javadoc sagt: „Für die meisten Anwendungen, die heute geschrieben werden, sind die ISO-8601-Regeln vollkommen geeignet. Jedoch wird jede Anwendung, die historische Daten verwendet und deren Genauigkeit verlangt, den ISO-8601-Ansatz als ungeeignet empfinden.“

  • Gut zu wissen, dass sie ihre Grenzen kennen. Schöner Fund.

    – Alain Cruz

    22. Oktober 2018 um 1:02 Uhr

  • Obligatorisches Tom Scott Video zu diesem Thema: youtube.com/watch?v=-5wpm-gesOY

    – Dan

    22. Oktober 2018 um 14:01 Uhr

  • Die Geschichte der Zeitmessung ist faszinierend. Eine Anekdote, die ich gelesen habe, besagt, dass, als Napoleon die Geißel Europas war, die Russen und die Deutschen (oder Engländer?) Vertreter trafen und vereinbarten, ihre verschiedenen Armeen an einem bestimmten Ort zu einem bestimmten Datum zu treffen. (Ich erinnere mich weder an das Datum noch an den Ort.) Jede Armee erschien zum festgelegten Datum, außer den Russen: Dieses Datum lag noch fast zwei Wochen in der Zukunft, und sie marschierten immer noch … Die Alliierten vergaßen das Die Russen benutzten noch den julianischen Kalender, während die anderen den gregorianischen Kalender verwendeten.

    – Henry

    22. Oktober 2018 um 16:33 Uhr

  • @Henry so wahr. Und etwas, das für die Menschen auf den ersten Blick so “offensichtlich” ist, wird zum Albtraum, es in eine Bibliothek zu codieren. Und auch pflegen! (Hey, lasst uns aufhören, die Sommerzeit in unserem Land zu verwenden! Hey, lasst uns am letzten Tag dieses Jahres eine Sekunde hinzufügen!)

    – Pac0

    22. Oktober 2018 um 20:11 Uhr

  • Ähnliche Vorbehalte gelten für GregorianCalendar: “GregorianCalendar implementiert proleptisch Gregorianischer und Julianischer Kalender. Das heißt, Datumsangaben werden berechnet, indem die aktuellen Regeln unendlich weit rückwärts und vorwärts in der Zeit extrapoliert werden. … Allerdings Daten erhalten mit GregorianCalendar sind erst ab dem 1. März 4 n. Chr. historisch korrekt, als die Regeln des modernen julianischen Kalenders eingeführt wurden. Vor diesem Datum wurden die Schaltjahrregeln unregelmäßig angewendet…“

    – 200_Erfolg

    22. Oktober 2018 um 22:40 Uhr

Benutzer-Avatar
Alex Taylor

Aus Wikipedia:

…es gibt ein Jahr Null in der astronomischen Jahreszählung (wo es mit dem julianischen Jahr 1 v. Chr. zusammenfällt) und in ISO 8601:2004 (wo es mit dem gregorianischen Jahr 1 v. Chr. zusammenfällt)

  • Hinweis: Der Neujahrstag war früher der 25. März, hatte aber etwas mehr Tage, so dass die Jahreszahlen so ausgerichtet waren, dass es nach dem gregorianischen Kalender näher am 12. März gelegen hätte.

    – Peter Lawrey

    22. Oktober 2018 um 7:34 Uhr

1206300cookie-checkJava sagt, dass das Jahr 0 ein Schaltjahr ist, aber das Jahr 0 hat nie existiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy