Jdtofrench: примеры (PHP)

Преобразование дат с помощью jdtofrench: примеры и особенности
Раздел: Дата и время
jdtofrench(int $julian_day): string

Функция jdtofrench

Описание и назначение

Функция jdtofrench() конвертирует количество дней по юлианскому календарю (JD - Julian Day Count) в дату по французскому республиканскому календарю, который использовался во Франции с 1793 по 1805 годы. Этот календарь также называют революционным. Функция применяется в исторических исследованиях, генеалогии или специальных приложениях для работы с альтернативными системами летоисчисления.

Аргументы функции

Функция принимает один обязательный аргумент:

  • $juliandaycount (int) - целое число, представляющее количество дней по юлианскому календарю. Должно быть больше или равно 2375840, что соответствует 22 сентября 1792 года - началу эры французского республиканского календаря.

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

Примеры использования

Базовый пример

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

<?php
// Юлианский день для 22 сентября 1792 года (начало календаря)
$jd = 2375840;
$frenchDate = jdtofrench($jd);
echo $frenchDate;
?>
vendemiaire/1/1
Пример с датой из периода действия календаря
<?php
// Преобразование для 5 ноября 1793 года (юлианский день 2376179)
$jd = 2376179;
echo jdtofrench($jd);
?>
brumaire/15/2
Пример с датой после окончания календаря
<?php
// Юлианский день для 1 января 1806 года (календарь уже не использовался)
$jd = 2380147;
echo jdtofrench($jd);
?>
nivose/11/14

Альтернативные функции в PHP

Функции для работы с юлианскими днями
  • jdtogregorian() - преобразует юлианский день в дату по григорианскому календарю. Используется для стандартных дат после 1582 года.
  • juliantojd() - конвертирует дату по юлианскому календарю в юлианский день. Подходит для дат до 1582 года.
  • frenchtojd() - обратная функция для jdtofrench, преобразует дату французского республиканского календаря в юлианский день.

Функцию jdtofrench предпочтительно использовать только для специализированных задач, связанных с историческим французским календарем. Для большинства практических применений лучше подходят функции для григорианского календаря.

Альтернативы в других языках

Jdtofrench в Python

В Python нет встроенной функции, но можно использовать библиотеку `pytime` или реализовать преобразование самостоятельно:

# Пример с использованием библиотеки convertdate
from convertdate import french_republican

# Преобразование григорианской даты в французскую республиканскую
french_date = french_republican.from_gregorian(1793, 11, 5)
print(french_date)  # Возвращает кортеж (год, месяц, день)
(2, 2, 15)

Jdtofrench в Javascript

В JavaScript нужно создавать собственную реализацию:

// Простой пример преобразования
function jdToFrench(jd) {
    const startJD = 2375840; // 22 сентября 1792
    const dayOfYear = (jd - startJD) % 365;
    const year = Math.floor((jd - startJD) / 365) + 1;
    // Упрощенный расчет (без учета високосных лет)
    return `Год: ${year}, День года: ${dayOfYear}`;
}

console.log(jdToFrench(2376179));
Год: 2, День года: 339

Jdtofrench в MySQL

В MySQL нет прямой функции, но можно использовать преобразование через стандартные даты:

-- Пример приблизительного преобразования
SELECT DATE_ADD('1792-09-22', INTERVAL 2376179-2375840 DAY) as gregorian_date;
1793-11-05

Типичные ошибки

Использование даты до начала календаря
<?php
// Попытка использовать юлианский день меньше минимального
$jd = 2375839; // 21 сентября 1792 года
echo jdtofrench($jd);
?>
Warning: jdtofrench(): jd is out of range for French Revolution calendar in ...
// или пустая строка в зависимости от версии PHP
Передача нецелого числа
<?php
// Функция ожидает целое число
$jd = 2376179.5;
echo jdtofrench($jd);
?>
Warning: jdtofrench() expects parameter 1 to be int, float given in ...
Некорректный тип аргумента
<?php
// Передача строки вместо числа
$jd = "2376179";
echo jdtofrench($jd); // В PHP 8+ будет ошибка типа
?>
Fatal error: Uncaught TypeError: jdtofrench(): Argument #1 ($juliandaycount) must be of type int, string given in ...

Изменения в версиях PHP

PHP 8.0.0

В PHP 8.0.0 была ужесточена проверка типов аргументов. Теперь функция ожидает строго целочисленное значение (int). В предыдущих версиях PHP допускалось неявное преобразование типов.

Исторические изменения

В ранних версиях PHP функция могла возвращать некорректные значения для некоторых дат из-за ошибок в алгоритме. В современных версиях (PHP 5.3+) эти ошибки исправлены.

Расширенные примеры

Создание полной даты с названием месяца
Пример php
<?php
// Функция для получения французской даты с названием месяца
function getFullFrenchDate($julianday) {
    $date = jdtofrench($julianday);
    if (empty($date)) return "Неверная дата";
    
    list($monthNum, $day, $year) = explode('/', $date);
    
    $monthNames = [
        1 => 'Вандемьер', 2 => 'Брюмер', 3 => 'Фример',
        4 => 'Нивоз', 5 => 'Плювиоз', 6 => 'Вантоз',
        7 => 'Жерминаль', 8 => 'Флореаль', 9 => 'Прериаль',
        10 => 'Мессидор', 11 => 'Термидор', 12 => 'Фрюктидор',
        13 => 'Дополнительные дни'
    ];
    
    $monthNum = (int)$monthNum;
    $monthName = $monthNames[$monthNum] ?? 'Неизвестный месяц';
    
    return "$day $monthName $year года Республики";
}

$jd = 2376179; // 5 ноября 1793 года
echo getFullFrenchDate($jd);
?>
15 Брюмер 2 года Республики
Обратное преобразование с проверкой
Пример php
<?php
// Полный цикл преобразования
$gregorianDate = '1794-07-27'; // 9 термидора II года
$jd = gregoriantojd(7, 27, 1794);
$frenchDate = jdtofrench($jd);
$backToJD = frenchtojd(...explode('/', $frenchDate));

echo "Григорианская дата: $gregorianDate<br>";
echo "Юлианский день: $jd<br>";
echo "Французская дата: $frenchDate<br>";
echo "Обратно в юлианский день: $backToJD<br>";
echo "Совпадают: " . ($jd === $backToJD ? 'да' : 'нет');
?>
Григорианская дата: 1794-07-27
Юлианский день: 2376938
Французская дата: thermidor/9/2
Обратно в юлианский день: 2376938
Совпадают: да
Работа с периодом действия календаря
Пример php
<?php
// Проверка, находилась ли дата в периоде использования календаря
function isInFrenchCalendarPeriod($year, $month, $day) {
    $jd = gregoriantojd($month, $day, $year);
    
    // Начало: 22 сентября 1792 года
    $startJD = gregoriantojd(9, 22, 1792);
    // Официальный конец: 31 декабря 1805 года
    $endJD = gregoriantojd(12, 31, 1805);
    
    return ($jd >= $startJD && $jd <= $endJD);
}

// Проверка для даты принятия календаря
$testDate = isInFrenchCalendarPeriod(1793, 10, 24);
echo "Дата 24 октября 1793 года в периоде календаря: " . 
     ($testDate ? 'да' : 'нет');
?>
Дата 24 октября 1793 года в периоде календаря: да
Обработка санкюлотид (дополнительных дней)
Пример php
<?php
// Получение информации о дополнительных днях в конце года
function getFrenchYearInfo($republicanYear) {
    $jd = frenchtojd(1, 1, $republicanYear);
    $nextYearJD = frenchtojd(1, 1, $republicanYear + 1);
    $daysInYear = $nextYearJD - $jd;
    
    $info = "Год $republicanYear: $daysInYear дней";
    if ($daysInYear > 360) {
        $extraDays = $daysInYear - 360;
        $info .= " (включая $extraDays санкюлотид)";
    }
    return $info;
}

// Проверка для первых трех лет
for ($year = 1; $year <= 3; $year++) {
    echo getFrenchYearInfo($year) . "<br>";
}
?>
Год 1: 365 дней (включая 5 санкюлотид)
Год 2: 365 дней (включая 5 санкюлотид)
Год 3: 366 дней (включая 6 санкюлотид)

PHP jdtofrench function comments

En
Jdtofrench Converts a Julian Day Count to the French Republican Calendar