unixtojd()
Как преобразовать Unix-временную метку в номер юлианского дня в PHP с помощью функции unixtojd() и обратно с помощью jdtounix().
Преобразование Unix-временной метки в юлианский день в PHP
Функция unixtojd() в PHP преобразует Unix-временную метку в номер юлианского дня (JDN) — целое число, представляющее количество дней, прошедших с начала юлианского периода (1 января 4713 г. до н. э. в пролептическом юлианском календаре). На этой странице объясняется, что возвращает функция, как её вызывать, в каких случаях результат может быть неожиданным и как выполнить обратное преобразование.
Unix-временная метка — это количество секунд, прошедших с 1 января 1970 года, 00:00:00 UTC. Номер юлианского дня (JDN) — это непрерывный счётчик дней, широко используемый в астрономии и в вычислениях с календарями, потому что разность двух номеров юлианских дней — это просто количество дней между ними, без сложной арифметики с месяцами и високосными годами. Обратите внимание: «юлианский день» здесь — это не дата в историческом юлианском календаре, а просто последовательный счётчик дней.
Как работает unixtojd()
unixtojd() берёт целое количество секунд из Unix-временной метки, переводит их в полные дни и прибавляет номер юлианского дня эпохи Unix (1970-01-01), равный 2440588. Преобразование выполняется в UTC, и результат имеет точность до дня — часы, минуты и секунды из временной метки отбрасываются, поэтому любой момент одного и того же дня UTC соответствует одному и тому же номеру юлианского дня.
unixtojd() входит в состав расширения Calendar PHP. В большинстве сборок оно компилируется по умолчанию, однако в минимальной установке PHP может потребоваться явно подключить расширение calendar, прежде чем функция станет доступна.
Синтаксис
unixtojd(?int $timestamp = null): int|false$timestamp— Unix-временная метка для преобразования. Если аргумент не указан (или переданnull), используется текущее время, как если бы вы передалиtime().- Возвращает целое число — номер юлианского дня, или
false, если временная метка не может быть преобразована.
Простой пример
Преобразование текущей Unix-временной метки в номер юлианского дня:
Этот код выводит текущую Unix-временную метку и соответствующий номер юлианского дня.
Известные контрольные точки
Поскольку преобразование фиксировано, некоторые временные метки всегда дают один и тот же номер юлианского дня. Они удобны для проверки корректности кода:
<?php
echo unixtojd(0), "\n"; // 2440588 -> 1970-01-01 (the Unix epoch)
echo unixtojd(mktime(0, 0, 0, 1, 1, 2000)), "\n"; // 2451545 -> 2000-01-01
echo unixtojd(mktime(0, 0, 0, 7, 4, 2025)), "\n"; // 2460861 -> 2025-07-04Вызов без аргументов
Вызов без аргумента эквивалентен передаче time(), поэтому обе строки ниже возвращают одно и то же значение:
<?php
echo unixtojd(), "\n"; // current day, no timestamp needed
echo unixtojd(time()), "\n"; // identical resultОбратное преобразование: jdtounix()
Обратной функцией для unixtojd() является jdtounix(), которая преобразует номер юлианского дня обратно в Unix-временную метку, соответствующую полуночи UTC этого дня. Поскольку unixtojd() отбрасывает время суток, после двойного преобразования вы получите начало дня, а не исходный момент:
<?php
$start = mktime(15, 30, 0, 7, 4, 2025); // 2025-07-04 15:30:00
$jd = unixtojd($start);
$back = jdtounix($jd);
echo "Original: ", gmdate("Y-m-d H:i:s", $start), " UTC\n"; // 2025-07-04 15:30:00 UTC
echo "Back: ", gmdate("Y-m-d H:i:s", $back), " UTC\n"; // 2025-07-04 00:00:00 UTCКогда стоит использовать эту функцию?
Номера юлианских дней особенно удобны, когда нужно подсчитать целые дни между двумя датами без сложной арифметики с длиной месяцев и високосными годами: астрономические вычисления, логика планирования, счётчики «дней до события», а также работа с научными наборами данных, в которых даты хранятся в виде юлианских дней. Для обычного форматирования дат и арифметики лучше подойдут API DateTime и функции работы с датами.
Заключение
unixtojd() преобразует Unix-временную метку в номер юлианского дня — счётчик дней в UTC, привязанный к значению эпохи 2440588. При вызове без аргумента по умолчанию используется текущее время, время суток игнорируется, а обратное преобразование выполняется с помощью jdtounix(). Комбинируйте функцию с mktime() и time() для перевода любого момента в юлианский день при расчётах на основе дат.