Расхождение заключается в том, как реализации Date
и Instant
взаимодействуют друг с другом в связи с их реализациями, причем Date использует григорианские / юлианские календари, а Instant использует стандарт ISO для Date, которые следуют за модифицированным григорианским календарем ранее.к юлианскому календарному переключению.
В реализации GregorianCalendar
есть специальное примечание:
Перед григорианским переключением GregorianCalendar реализует юлианский календарь.Единственная разница между григорианским и юлианским календарями - это правило високосного года.Юлианский календарь определяет високосные годы каждые четыре года, тогда как в григорианском календаре пропускаются столетние годы, которые не делятся на 400.
Ну, технически говоря, да.Но для этой проблемы мы не можем вполне столкнуться с этим.
cal.set(1582, Calendar.OCTOBER, 4, 0, 0, 0);
Это дает дату, как и ожидалось, 4 октября 1582 года.
cal.set(1582, Calendar.OCTOBER, 5, 0, 0, 0);
Это дает дату, октябрь 15 , 1582.
ЧТО ЭТО МАГИЯ, БАТМАН?
Ну, это не ошибка кодирования, это на самом делереализация GregorianCalendar.
Однако в этом году началось переключение григорианского календаря, когда папский бык, известный как «Интер грависим», ввел григорианский календарь, принятый Испанией, Португалией, Речью Посполитой.и большая часть современной Италии с самого начала.В этих странах год продолжался как обычно до четверга, 4 октября. Однако следующим днем стала пятница, 15 октября (как обычный год, начинающийся в пятницу),
Из Википедии по 1582
Когда мы рассмотрим 4 октября 1582 г., происходит следующее:
Дата: 1582-окт-04 00: 00: 00
Мгновенный: 1582-10-14T00: 00: 00Z
Здесь 10-дневный разрыв, и причина, по которой момент существует в «технически несуществующую дату», заключается в том, чтоучитывается по определению мгновенных дат ISO .
Стандарт гласит, что каждая дата должна быть последовательной , поэтому использование юлианского календаря будет противоположнымк стандарту (потому что на дату переключения даты не будут последовательными).
ТАК, тогда как 14 октября 1582 года никогда не существовало в действительности, оно существует во времени ISO по определению, но происходит в реальном мире 4 октября 1582 года согласно юлианскому календарю.
Из-за того, что я предполагаю, есть дополнительные смещения високосного года из первого абзаца, где юлианские века 1500, 1400, 1300, 1100, 1000, 900, 700, 600, 500, 300, 200, 100 имеют дополнительные високосные дни, не учитываемые вПо григорианскому календарю мы медленно сдвигаемся назад от +10 к смещению -1.Это можно проверить, отрегулировав год с шагом +100.
Если вы отображаете даты исторических событий, вам лучше использовать Date
или JulianCalendar
DateFormatter для отображенияправильная правильная историческая дата, как это произошло в историиРаспечатка времени ISO для исторических периодов может показаться бессмысленной или неточной, но сохранение времени в этом формате все еще допустимо.