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 неподходящим. "