Юлианская дата

Юлианская дата — простой непрерывный счётчик дней, на котором держатся все расчёты времени в астрономии.

Юлианская дата (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-й месяц» делает формулу високосных лет простой.
Проверьте себя
1. Чему равна юлианская дата эпохи J2000.0?
A2451545.0
B2000.0
C0.0
D2460390.5
2. В чём главное удобство юлианской даты?
AОна короче обычной даты
BРазность двух JD сразу даёт число дней между датами
CОна учитывает часовые пояса
DОна показывает фазу Луны
3. Зачем январь и февраль в формуле считают 13-м и 14-м месяцами прошлого года?
AЧтобы 29 февраля всегда оказывалось в конце 'года' и формула високосных лет упрощалась
BЧтобы запутать читателя
CЭто ошибка в алгоритме
DЧтобы учесть часовой пояс