Ява говорит, что год 0 - високосный год, но год 0 никогда не существовал - PullRequest
0 голосов
/ 22 октября 2018

Я писал несколько тестов для некоторых удобных методов, которые я обновляю, и решил посмотреть, что произойдет, если я использую метод LocalDate isLeapYear() в год 0. Насколько я понимаю, год 0 никогда не был на самом делесуществовало: годом ранее 1 г. н.э. был 1 г. до н.(Это основано на статье, которую я прочитал много лет назад, источник которой я давно забыл.) К моему большому удивлению, мой тест показал, что год 0 был високосным!

Я понимаю, что java.time.LocalDateкласс реализует ISO-8601, но действительно ли ISO-8601 указывает на то, что год 0 существовал?Я не хочу верить, что люди, которые тестировали LocalDate, пропустили бы это как тестовый пример, но я также неохотно считаю, что международный стандарт, такой как ISO-8601, допустил бы такую ​​очевидную ошибку.

Другая возможность состоит в том, что статья, которую я прочитал, была просто ошибочной.(Или это было правильно тогда, но было переосмыслено позже.)

Это не очень важно, но мне любопытно знать, где ошибка: ISO-8601, класс Java LocalDate или мое понимание того, как времясчитается

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

TL; DR: LocalDate делает то, что задокументировано, в соответствии с международным стандартом (ISO 8601).Является ли это «правильным» или нет, это совершенно другой вопрос.

LocalDate Javadoc сам включает в себя следующее предупреждение:

Это эквивалентноПрелептическая система григорианского календаря, в которой современные правила для високосных годов применяются на все времена.Для большинства приложений, написанных сегодня, правила ISO-8601 полностью подходят.Однако любое приложение, которое использует исторические даты и требует, чтобы они были точными, найдет подход ISO-8601 непригодным.

В Википедии есть больше информации о Григорианском календаре ,Среди прочего, в нем говорится:

Математически удобнее включить год 0 и представить более ранние годы как отрицательные, для конкретной цели облегчения расчета числа лет между отрицательными(BC) год и положительный (AD) год.Это соглашение используется в нумерации астрономических годов и в международной стандартной системе дат ISO 8601. В этих системах год 0 является високосным годом.

Прости меня, пока я отвлекся на некоторыеисторический контекст для всего этого.

Годы в западном календаре якобы отсчитываются от рождения Иисуса Христа, но идея сделать это началась в шестом веке, и наш текущий календарь основан на вычислениях, сделанных в шестнадцатомвека.Поскольку римские цифры не имели представления ни нуля, ни отрицательных чисел, годы учитывались либо «после Иисуса» (н.э., для anno domini ), либо «до Иисуса» (до н.э., для «до Христа»).Таким образом, традиционно за 1 г. до н.э. последовала 1 г. н.э., без нулевого года между.

Однако в первом веке никто не считал годы таким образом;для сравнения, Евангелие от Луки описывает год, когда Иисус начал свое служение, как

в пятнадцатый год царствования Тиберия Цезаря, Понтий Пилат был правителем Иудеи, а Ирод был тетрархом Галилейским,и его брат Филипп тетрарх из Итурии и области Трахонита и Лизания тетрарх из Абилина,

Якобы это было бы 30 г. н.э., так как Лука описывает Иисуса как "около тридцати лет"" в это время.Но современные историки в целом согласны с тем, что Дионисий Эксигус, который в 525 году нашей эры предложил систему anno domini , ошибся, и поэтому нумерация лет отсчитывается как минимум на один или два года.(Точная дата все еще несколько противоречива; см. Википедия , если вам нужны подробности.)

Но сейчас уже слишком поздно исправлять;даже переход от юлианского к григорианскому календарю, расхождение которого составило менее двух недель, встретил широкое политическое сопротивление, поскольку переход произошел по всей Европе в течение нескольких столетий - вы можете себе представить, насколько разрушительным является изменение нумерации года.было бы сейчас!

Так какое отношение эта история имеет к программному обеспечению сегодня?К сожалению, из-за множества способов, которыми даты вычислялись и записывались на протяжении всей истории, вам нужно либо отказаться от календаря, который ведет себя согласованно, по мере продвижения вперед и назад во времени, либо вы должны отказаться от рассчитанных датиметь какое-либо соответствие датам, которые реальные люди использовали бы в то время.Расхождение происходит быстрее, чем вы думаете: многие европейские страны все еще использовали юлианский календарь менее 100 лет назад, с расхождением почти в две недели от всех остальных в Европе!


Понятно, что LocalDate моет руки в этом беспорядке и реализует календарь только так, как мы его используем сегодня.Повторяя слова Javadoc: "Для большинства приложений, написанных сегодня, правила ISO-8601 полностью подходят. Однако любое приложение, которое использует исторические даты и требует их точности, найдет подход ISO-8601 неподходящим. "

0 голосов
/ 22 октября 2018

С Википедия :

... в нумерации астрономических годов (где она совпадает с юлианским годом 1 до н.э.) и в ISO 8601: 2004 есть ноль.(где это совпадает с григорианским годом 1 до н.э)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...