jdtofrench()
Введение
Французский революционный календарь, также известный как республиканский календарь, был создан во время Великой французской революции и использовался во Франции с 1793 по 1805 год. Он был разработан для замены григорианского календаря и должен был стать более рациональным и научным. Календарь основывался на идее десятичного времени и состоял из 12 месяцев по 30 дней каждый, с добавлением дополнительных 5 или 6 дней в конце года для компенсации оставшихся дней.
С другой стороны, юлианский день (Julian Day Count) — это система исчисления дней, используемая в астрономии. Он определяется как количество дней, прошедших с полудня 1 января 4713 года до н. э. (по юлианскому календарю). В PHP в составе расширения Calendar встроена функция jdtofrench() для преобразования юлианского дня в даты французского революционного календаря, которая автоматически учитывает правила високосных лет этого календаря.
Формула преобразования
Для преобразования юлианского дня в дату французского революционного календаря используется следующий алгоритм:
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-дневного цикла:
J = JDC - 2375839
N = J mod 365Шаг 2: Вычисление Q и R
Французский революционный календарь делит год на 12 месяцев по ровно 30 дней, за которыми следуют 5 или 6 дополнительных дней. Номер месяца (Q) и дня (R) определяются по следующим правилам:
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:
J = 2376000 - 2375839 = 161
N = 161 mod 365 = 161Далее вычислим Q и R:
N < 360, so:
Q = floor(161 / 30) + 1 = 5 + 1 = 6
R = (161 mod 30) + 1 = 11 + 1 = 126-й месяц соответствует Брюмеру. Следовательно, юлианский день 2376000 соответствует 12 Брюмер года I (12 октября 1792 года).
Реализация в PHP
В PHP в составе расширения Calendar доступна встроенная функция jdtofrench(), которая автоматически выполняет преобразование и учитывает логику високосных лет:
// Requires the Calendar extension
echo jdtofrench(2376000); // Outputs: 12 Brumaire, Year 1Для дат, предшествующих началу отсчёта календаря (22 сентября 1792 года), следует проверять входные данные, чтобы избежать неожиданных результатов:
$jdc = 2376000;
if ($jdc >= 2375839) {
echo jdtofrench($jdc);
} else {
echo "Date is before the French Revolutionary Calendar epoch.";
}Заключение
В заключение, PHP предоставляет встроенную функцию jdtofrench() в расширении Calendar для преобразования юлианских дней в даты французского революционного календаря. Используя эту нативную функцию, вы сможете точно переводить исторические даты, автоматически учитывая правила високосных лет и дополнительные дни календаря.
Практика
Что делает функция jdtofrench() в PHP?