Перейти к содержимому

jdtofrench()

Введение

Французский революционный календарь, также известный как республиканский календарь, был создан во время Великой французской революции и использовался во Франции с 1793 по 1805 год. Он был разработан для замены григорианского календаря и должен был стать более рациональным и научным. Календарь основывался на идее десятичного времени и состоял из 12 месяцев по 30 дней каждый, с добавлением дополнительных 5 или 6 дней в конце года для компенсации оставшихся дней.

С другой стороны, юлианский день (Julian Day Count) — это система исчисления дней, используемая в астрономии. Он определяется как количество дней, прошедших с полудня 1 января 4713 года до н. э. (по юлианскому календарю). В PHP в составе расширения Calendar встроена функция jdtofrench() для преобразования юлианского дня в даты французского революционного календаря, которая автоматически учитывает правила високосных лет этого календаря.

Формула преобразования

Для преобразования юлианского дня в дату французского революционного календаря используется следующий алгоритм:

console
J = JDC - 2375839
N = J mod 365
if N < 360 then
    Q = floor(N / 30) + 1
    R = (N mod 30) + 1
else
    Q = 13
    R = N - 359
end if

Где:

  • J — количество дней, прошедших с начала французского революционного календаря (22 сентября 1792 года)
  • N — номер дня в текущем году (0–364)
  • Q — номер месяца (1–12 для 12 месяцев, 13 для дополнительных дней)
  • R — номер дня в месяце (1–30) или дополнительный день (1–5/6)

Объяснение формулы

Формула преобразования юлианского дня в дату французского революционного календаря достаточно проста при пошаговом разборе. Рассмотрим каждый этап.

Шаг 1: Вычисление J и N

Сначала вычислите J, вычтя из целевого юлианского дня значение 2375839 (юлианский день 22 сентября 1792 года, начало отсчёта календаря). Затем найдите N — номер дня внутри текущего 365-дневного цикла:

console
J = JDC - 2375839
N = J mod 365

Шаг 2: Вычисление Q и R

Французский революционный календарь делит год на 12 месяцев по ровно 30 дней, за которыми следуют 5 или 6 дополнительных дней. Номер месяца (Q) и дня (R) определяются по следующим правилам:

console
if N < 360 then
    Q = floor(N / 30) + 1
    R = (N mod 30) + 1
else
    Q = 13
    R = N - 359
end if

Если N меньше 360, дата попадает в один из 12 месяцев. Мы делим N на 30, чтобы найти индекс месяца, и прибавляем 1. Остаток даёт индекс дня, который также корректируется прибавлением 1. Если N равно 360 или больше, дата попадает в период дополнительных дней (Санкюлотиды), которому присваивается номер месяца 13.

Пример

Преобразуем юлианский день 2376000 в дату французского революционного календаря.

Сначала вычислим J и N:

console
J = 2376000 - 2375839 = 161
N = 161 mod 365 = 161

Далее вычислим Q и R:

console
N < 360, so:
Q = floor(161 / 30) + 1 = 5 + 1 = 6
R = (161 mod 30) + 1 = 11 + 1 = 12

6-й месяц соответствует Брюмеру. Следовательно, юлианский день 2376000 соответствует 12 Брюмер года I (12 октября 1792 года).

Реализация в PHP

В PHP в составе расширения Calendar доступна встроенная функция jdtofrench(), которая автоматически выполняет преобразование и учитывает логику високосных лет:

php
// Requires the Calendar extension
echo jdtofrench(2376000); // Outputs: 12 Brumaire, Year 1

Для дат, предшествующих началу отсчёта календаря (22 сентября 1792 года), следует проверять входные данные, чтобы избежать неожиданных результатов:

php
$jdc = 2376000;
if ($jdc >= 2375839) {
    echo jdtofrench($jdc);
} else {
    echo "Date is before the French Revolutionary Calendar epoch.";
}

Заключение

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

Практика

Что делает функция jdtofrench() в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.