jdtofrench()
Французский революционный календарь был создан в эпоху Французской революции и использовался во Франции с 1793 по 1805 год.
Введение
Французский революционный календарь, также известный как Республиканский календарь, был создан в эпоху Французской революции и использовался во Франции с 1793 по 1805 год. Он был разработан как замена Григорианскому календарю с целью сделать систему счисления времени более рациональной и научной. Календарь основывался на принципе десятичного времени и состоял из 12 месяцев по 30 дней каждый, с добавлением 5 или 6 дополнительных дней в конце года для компенсации лишних суток.
Юлианский счёт дней, в свою очередь, — это система счёта дней, используемая в астрономии. Она определяется как количество дней, прошедших с полудня 1 января 4713 года до нашей эры (по Юлианскому календарю). PHP включает встроенную функцию jdtofrench() в расширении Calendar для преобразования Юлианского счёта дней в Французский революционный календарь, которая автоматически учитывает правила высокосного года данного календаря.
Формула преобразования
Для преобразования Юлианского счёта дней в дату Французского революционного календаря используется следующий алгоритм:
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.
Синтаксис
jdtofrench(int $julian_day): string| Параметр | Описание |
|---|---|
$julian_day | Целое число Юлианского счёта дней для преобразования. |
Возвращаемое значение: строка в формате "month/day/year", где каждая часть является числом (например "6/12/1"). Функция возвращает "0/0/0" для любого Юлианского счёта дней, выходящего за пределы допустимого диапазона календаря (с 22 сентября 1792 года по 22 сентября 1806 года).
Пример
Преобразуем Юлианский счёт дней 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 = 12Таким образом, результат: месяц 6, день 12, год 1. По таблице месяцев ниже месяц 6 — это Вантоз, то есть 12 Вантоза, год 1.
Реализация на PHP
PHP предоставляет встроенную функцию jdtofrench() в расширении Calendar, которая выполняет преобразование и автоматически обрабатывает логику дополнительных дней. Она возвращает числовую строку "month/day/year":
// Requires the Calendar extension
echo jdtofrench(2376000); // Outputs: 6/12/1Три числа точно соответствуют вычисленным выше Q (месяц), R (день) и году. Чтобы получить историческое название месяца, разбейте строку и найдите месяц в таблице:
$frenchMonths = [
1 => "Vendémiaire", 2 => "Brumaire", 3 => "Frimaire",
4 => "Nivôse", 5 => "Pluviôse", 6 => "Ventôse",
7 => "Germinal", 8 => "Floréal", 9 => "Prairial",
10 => "Messidor", 11 => "Thermidor", 12 => "Fructidor",
13 => "Sans-culottides",
];
list($month, $day, $year) = explode("/", jdtofrench(2376000));
echo "{$day} " . $frenchMonths[$month] . ", Year {$year}"; // 12 Ventôse, Year 1Для дат, выходящих за пределы допустимого диапазона календаря, функция возвращает "0/0/0", поэтому следует проверять этот маркер вместо того, чтобы предполагать корректную дату:
$jdc = 2376000;
$result = jdtofrench($jdc);
if ($result !== "0/0/0") {
echo "French Republican date: {$result}";
} else {
echo "Date is outside the French Revolutionary Calendar range.";
}Связанные функции
Расширение Calendar предоставляет парные конвертеры, которые можно использовать совместно с jdtofrench():
- frenchtojd() — обратное преобразование: из даты Французского республиканского календаря в Юлианский счёт дней.
- jdtogregorian() — из Юлианского счёта дней в Григорианскую дату.
- jdtojulian() — из Юлианского счёта дней в дату Юлианского календаря.
- jddayofweek() — день недели для заданного Юлианского счёта дней.
Заключение
Таким образом, PHP предоставляет встроенную функцию jdtofrench() в расширении Calendar для преобразования Юлианского счёта дней в даты Французского революционного календаря. Используя эту нативную функцию, можно точно переводить исторические даты с автоматическим учётом правил высокосного года и дополнительных дней календаря.