Jdtofrench: примеры (PHP)
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 была ужесточена проверка типов аргументов. Теперь функция ожидает строго целочисленное значение (int). В предыдущих версиях PHP допускалось неявное преобразование типов.
В ранних версиях PHP функция могла возвращать некорректные значения для некоторых дат из-за ошибок в алгоритме. В современных версиях (PHP 5.3+) эти ошибки исправлены.
Расширенные примеры
<?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
// Полный цикл преобразования
$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
// Проверка, находилась ли дата в периоде использования календаря
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
// Получение информации о дополнительных днях в конце года
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 санкюлотид)