При просмотре трассировки Ruby автор заметил странную константу Date::ITALY со значением 2299161. Оказалось, что в класс Date встроены скрытые константы, обозначающие даты перехода на григорианский календарь для разных регионов: Date::ENGLAND для Англии, Date::GREGORIAN, Date::JULIAN и другие. На первый взгляд странно, что в коде Ruby упоминаются католические страны, но причина кроется в истории历法. Юлианский календарь, установленный Цезарем, накапливал погрешность в один день каждые 128 лет, и к 1580-м годам дата Пасхи значительно сместилась. В 1582 году папа Григорий XIII выпустил буллу, согласно которой после 4 октября следует 15 октября. Ruby реализует это правило, выбрасывая ошибку при попытке создать дату в промежуток из десяти пропущенных дней, например 5 октября 1582 года. Вместо этого он автоматически пропускает этот отрезок времени и переключается на новый календарь. Число 2299161 — это именно юлианский день, когда Италия перешла на григорианскую систему.
История юлианского дня уходит корнями в 4713 год до нашей эры, когда синхронизировались солнечный цикл в 28 лет, лунный в 19 лет и налоговая индикция в 15 лет. Это период в 7980 лет. Поскольку страны перешли на новый календарь в разное время, например, Англия ждет 1752 года из-за протестантского сопротивления, нужна была универсальная единица измерения. Учёный Джозеф Скалигер предложил метод юлианского периода, который, к слову, назван не в честь Юлия Цезаря, а в честь его отца. В Ruby класс Date использует параметр start, указывающий точку перехода на григорианский календарь. По умолчанию используется значение, соответствующее 1 января 4712 года до н. э. Если задать Date::JULIAN, это равно бесконечности, так как переход никогда не произойдёт. А Date::GREGORIAN равно минус бесконечности, предполагая, что мы всегда использовали григорианский стиль. Так, рождение Ньютона можно корректно описать датой 25 декабря 1642 года со стартом Date::ENGLAND, а не как 4 января 1643 года. Эти значения в формате inspect даты показывают юлианский день и смещение перехода. Если вы моделируете даты для России, где переход состоялся 14 февраля 1918 года, нужно указать соответствующий юлианский день. Концептуально дата в Ruby представляет собой пару из юлианской даты и момента перехода на григорианский календарь.