Gregoriantojd: примеры (PHP)
gregoriantojd(int $month, int $day, int $year): intФункция gregoriantojd: описание и параметры
Функция gregoriantojd преобразует дату из григорианского календаря в юлианский день (Julian Day Count, JDC). Юлианский день — это непрерывный счет дней, начатый с 1 января 4713 года до н. э. по юлианскому календарю. Эта система удобна для астрономических расчетов и операций с датами, таких как вычисление разницы между датами.
Функция находит применение в задачах, требующих работы с историческими датами, астрономических вычислениях, преобразованиях между календарными системами и для точных хронологических операций.
Функция принимает три целочисленных аргумента, все они обязательны:
int gregoriantojd(int $month, int $day, int $year)$month — номер месяца (от 1 до 12).
$day — день месяца (от 1 до 31, в зависимости от месяца).
$year — год. Диапазон корректной работы — от -4714 до 9999. Год 0 не существует, следует использовать 1 до н. э. или -1.
Простые примеры использования
echo gregoriantojd(8, 24, 2023);2460179echo gregoriantojd(10, 15, 1582);2299161echo gregoriantojd(1, 1, -4714);1echo gregoriantojd(12, 31, 9999);5373484Часто используется вместе с функцией jdtogregorian.
$jd = gregoriantojd(5, 9, 1995);
echo jdtogregorian($jd);5/9/1995Похожие функции в PHP
Обратная функция для gregoriantojd. Преобразует юлианский день обратно в григорианскую дату в формате 'месяц/день/год'.
juliantojd, jewishtojd, frenchtojd, jalali — преобразуют даты из юлианского, иудейского, французского республиканского и других календарей.
Класс DateTime и связанные с ним классы (DateTimeImmutable, DateInterval) предоставляют более современный и гибкий способ работы с датами и временем в PHP, включая поддержку временных зон и форматирования. Для большинства современных задач, не связанных напрямую с юлианскими днями, рекомендуется использовать именно эти классы.
Аналоги в других языках программирования и СУБД
Gregoriantojd в Python
Модуль datetime не имеет прямой аналогии, но можно использовать метод toordinal() или сторонние библиотеки (например, julianday).
from datetime import datetime
dt = datetime(2023, 8, 24)
jd = dt.toordinal() + 1721425.5 # Приблизительное преобразование
print(jd)2460179.5Gregoriantojd в Javascript
Прямого аналога нет, но можно реализовать вычисление по формуле.
function gregorianToJD(year, month, day) {
let a = Math.floor((14 - month) / 12);
let y = year + 4800 - a;
let m = month + 12 * a - 3;
return day + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) - 32045;
}
console.log(gregorianToJD(2023, 8, 24));2460179Gregoriantojd в MySQL
Функция TO_DAYS() возвращает количество дней с года 0 (не путать с юлианскими днями). Для получения приближенного результата можно добавить константу.
SELECT TO_DAYS('2023-08-24') + 1721060 AS julian_day_approx;2460179Типичные ошибки при использовании
Функция не выбрасывает исключения, но возвращает 0 при передаче недопустимых значений.
echo gregoriantojd(13, 40, 2023); // Неверный месяц и день0Года 0 не существует в григорианском календаре. Следует использовать 1 до н. э. (передается как -1) или 1 н. э. (передается как 1).
echo gregoriantojd(1, 1, 0);0Функция работает только с отдельными числами, а не с отформатированными строками дат. Это частая ошибка новичков.
Изменения в функции в новых версиях PHP
Функция gregoriantojd является частью календарных функций PHP, которые остаются стабильными на протяжении многих лет. Значительных изменений в поведении функции в PHP 7.x и PHP 8.x не зафиксировано. Основные улучшения в работе с датами в последних версиях PHP касаются в первую очередь объектно-ориентированного API (DateTime), а не процедурных календарных функций.
Расширенные и специальные примеры
$jd1 = gregoriantojd(5, 9, 1995);
$jd2 = gregoriantojd(8, 24, 2023);
$daysBetween = $jd2 - $jd1;
echo "Между датами прошло $daysBetween дней.";Между датами прошло 10340 дней.$jd = gregoriantojd(7, 20, 1969); // Высадка на Луну
$dayOfWeek = jddayofweek($jd, 1); // 1 - возврат строкового имени
echo "20 июля 1969 года было $dayOfWeek.";20 июля 1969 года было Sunday.function isGregorianDateValid($m, $d, $y) {
return gregoriantojd($m, $d, $y) != 0;
}
var_dump(isGregorianDateValid(2, 29, 2023)); // Невисокосный год
var_dump(isGregorianDateValid(2, 29, 2024)); // Високосный годbool(false)
bool(true)Функция может вычислять юлианские дни для дат до 15 октября 1582 года (начала действия календаря), но эти результаты носят чисто арифметический характер, так как календарь применялся позже.
echo gregoriantojd(10, 4, 1582); // 4 октября 1582 (юлианский)
echo "\n";
echo gregoriantojd(10, 15, 1582); // 15 октября 1582 (григорианский)2299160
2299161MJD = JD - 2400000.5. Часто используется в астрономии и космической навигации.
$jd = gregoriantojd(11, 17, 1858);
$mjd = $jd - 2400000.5;
echo "MJD начала отсчета: $mjd";MJD начала отсчета: 0