W3docs

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 для преобразования Юлианского счёта дней в даты Французского революционного календаря. Используя эту нативную функцию, можно точно переводить исторические даты с автоматическим учётом правил высокосного года и дополнительных дней календаря.

Практика

Практика
Что делает функция jdtofrench() в PHP?
Что делает функция jdtofrench() в PHP?
Was this page helpful?