Юлианская дата
Юлианская дата — простой непрерывный счётчик дней, на котором держатся все расчёты времени в астрономии.
Юлианская дата (JD) — число дней (с дробной частью), прошедших с полудня 1 января 4713 года до н.э. по юлианскому календарю.
Зачем непрерывный счёт
Обычный календарь неудобен для вычислений: месяцы разной длины, високосные годы, переходы между календарями. Сколько дней между 15 февраля 1923 и 3 ноября 2024? Считать вручную мучительно. Юлианская дата решает проблему: это просто большое число, и разность двух JD сразу даёт количество дней. Поэтому астрономы переводят любую дату в JD, считают, и при необходимости переводят обратно.
Формула перевода
Для даты в григорианском календаре (год $Y$, месяц $M$, день $D$ с дробной частью) используют алгоритм с целочисленными частями:
import math
def julian_date(year, month, day, hour=0, minute=0, second=0):
"""Календарная дата (григорианская) -> юлианская дата."""
if month <= 2:
year -= 1
month += 12
A = year // 100
B = 2 - A + A // 4 # григорианская поправка
day_frac = day + (hour + minute / 60 + second / 3600) / 24
jd = (int(365.25 * (year + 4716))
+ int(30.6001 * (month + 1))
+ day_frac + B - 1524.5)
return jd
# Стандартная эпоха J2000.0 — полдень 1 января 2000
print("JD J2000.0:", julian_date(2000, 1, 1, 12, 0, 0))
# Весеннее равноденствие 2024 (примерно)
print("JD 2024-03-21:", julian_date(2024, 3, 21))
# Разность в днях
print("Дней между ними:", round(julian_date(2024, 3, 21) - julian_date(2000, 1, 1, 12), 1))Вывод:
JD J2000.0: 2451545.0 JD 2024-03-21: 2460390.5 Дней между ними: 8845.5
Как работает под капотом
Хитрость с if month <= 2 — это классический приём: январь и февраль считают 13-м и 14-м месяцами предыдущего года, чтобы вставка високосного дня (29 февраля) всегда оказывалась в конце «года». Тогда формула с int(30.6001 * (month + 1)) корректно отмеряет накопленные дни по месяцам. Поправка $B$ учитывает разницу между юлианским и григорианским календарями (правило високосных столетий). Дробная часть $0.5$ появляется потому, что юлианский день начинается в полдень, а не в полночь.
Частые ошибки
- Забыть про сдвиг январь/февраль — даты в начале года посчитаются неверно.
- Перепутать JD (от полудня) и MJD (модифицированную, от полуночи: $MJD = JD - 2400000.5$).
- Игнорировать дробную часть времени — без неё точность будет только до суток.
Итог
- JD — непрерывный счёт дней; разность двух JD сразу даёт число дней между датами.
- Эпоха J2000.0 = JD 2451545.0 (полдень 1 января 2000) — точка отсчёта многих формул.
- Приём «январь и февраль как 13-й/14-й месяц» делает формулу високосных лет простой.