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

Использование 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);
2460179
Преобразование исторической даты
echo gregoriantojd(10, 15, 1582);
2299161
Граничные значения года
echo gregoriantojd(1, 1, -4714);
1
echo 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.5

Gregoriantojd в 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));
2460179

Gregoriantojd в MySQL

Функция TO_DAYS() возвращает количество дней с года 0 (не путать с юлианскими днями). Для получения приближенного результата можно добавить константу.

SELECT TO_DAYS('2023-08-24') + 1721060 AS julian_day_approx;
2460179

Типичные ошибки при использовании

Некорректный диапазон аргументов

Функция не выбрасывает исключения, но возвращает 0 при передаче недопустимых значений.

echo gregoriantojd(13, 40, 2023); // Неверный месяц и день
0
Использование года 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
2299161
Преобразование в Modified Julian Day (MJD)

MJD = JD - 2400000.5. Часто используется в астрономии и космической навигации.

$jd = gregoriantojd(11, 17, 1858);
$mjd = $jd - 2400000.5;
echo "MJD начала отсчета: $mjd";
MJD начала отсчета: 0

PHP gregoriantojd function comments

En
Gregoriantojd Converts a Gregorian date to Julian Day Count