Юлианский день

Добавлено 9 Января 2008

В этой статье описаны методы для перевода даты Юлианского или Григорианского календаря в соответствующий порядковый номер — Юлианский день, JD (англ. Julian Day), и перевод в обратную сторону.

Основные замечания

Номер Юлианского дня, или проще говоря, Юлианский день (JD) — это натуральное число (включающее и дробную часть), выражающее количество дней, прошедших с начала 4712 г. По традиции принято считать, что Юлианский день начинается в полдень по среднему Гринвичскому времени, что есть 12ч по Всемирному времени, UT (англ. Universal Time). Если Юлианский день относится к моменту времени, измеряемому по шкале Динамического времени (или Эфемеридного времени), то, как правило, используют термин Юлианский Эфемеридный День, JDE (англ. Julian Ephemeris Day).

Пример:

26.4 Апреля 1977 UT = JD  2443 259.9
26.4 Апреля 1977 TD = JDE 2443 259.9

В методах, описанных ниже, следует учитывать реформу Григорианского календаря. А именно, за днем 4 октября 1582 года (Юлианский календарь) следует день 15 октября 1582 (Григорианский календарь). Григорианский календарь был не сразу признан во всем мире. Это нужно учитывать, обращаясь к историческим реалиям. Так, например, в Великобритании реформа произошла в конце 1752 г. н.э., а в Турции Юлианский календарь просуществовал вплоть до 1927 г. Юлианский календарь был учрежден в Римской Империи Юлием Цезарем в -45 г, и достиг своей окончательной формы около 8 года. Тем не менее, мы будем следовать астрономической практике, заключающейся в экстраполировании Юлианского календаря в прошлое на бесконечное время. В связи с этим мы можем говорить, например, о солнечном затмении 28 августа -1203 г. по Юлианскому клендарю, хотя в это далекое время Римской Империи еще не существовало и император Август, чьим именем назван месяц, даже не был рожден! В этом заключается расхождение во мнениях астрономов и историков по поводу того, как исчислять года, предшествующие 1-му году. Мы будем годы «до н.э.» исчислять так, как принято в астрономии. То есть год, предшествующий году +1, есть год нулевой, а год, предшествующий последнему, есть год -1. Год, который историки называют 585 г. до н.э., соответсвует -584 году в астрономии. Такая отрицательная нумерация годов как нельзя лучше подходит для математических рассчетов. Например, при исторической нумерации годов правило деления на 4 обнаруживает ошибку: високосные годы не кратны четырем: 1-й, 5-й, 9-й, 13-й, ... гг. до н.э. Однако, при использовании астрономического способа нумерации последовательность соответствует истине: 0-й, -4-й, -8-й, -12-й, ... гг. кратны 4-м и являются високосными. Правило деления на 4 не нарушается. Мы будем обозначать целую часть числа x как INT(x), т.е. то число, которое предшествует его дробной части.

Примеры:

INT(7/4) = 1    INT(5.02)   = 5
INT(8/4) = 2    INT(5.9999) = 5

Это может вызвать некоторые проблемы с отрицательными числами. Существуют два понимания операции INT. В некоторых компьютерах и языках программирования, INT(x) есть наибольшее целое число, меньшее или равное числу x. В этом случае мы получим, например, INT(-7.83)=-8, так как -7 действительно больше чем -7.83. В других языках, INT есть целая часть записываемого числа, т.е. то число, что предшествует символу десятичной точки. Тогда INT(-7.83)=-7. Эта операция носит название отсечение (англ. truncation), и многие языки прогаммирования имеют обе функции: INT(x), выполоняющую операцию в первом понимании, и TRUNC(x). Впредь будьте внимательны, когда используете функцию INT для отрицательных чисел (для положительных чисел оба варианта понимания функции дадут один результат). В формулах, данных ниже, аргумент функции INT всегда положителен.

Вычисление Юлианского дня

Следующий метод справедлив как для положительных, так и для отрицательных значений годов, не не для отрицательного значения Юлианского дня (JD).

Пусть для заданной календарной даты Y — номер года, M — номер месяца (1 для января, 2 для февраля и т.д., 12 для декабря), и D — день месяца (с десятичной дробной частью, если это имеет место).

  • Если M > 2, то оставляем Y и M неизменными.
    Если M = 1 или 2, заменяем Y на Y - 1, и M на M + 12.
    Другими словами, если исходная дата имеет месяц январь или февраль, то они намеренно рассматриваются как 13-й и 14-й месяцы предыдущего года.
  • Если рассчет ведется по Григорианскому календарю, то считаем:

    A = INT(Y / 100)
    B = 2 - A + INT(A / 4)

    Если рассчет ведется по Юлианскому календарю, полагаем B = 0.
  • Искомое значение Юлианского дня есть:
JD = INT(365.25(Y + 4716)) + INT(30.6001(M + 1)) + D + B - 1524.5 [1]

Число 30.6 (вместо 30.6001) будет давать верный результат, но 30.6001 используется для того, чтобы целое число (второе слагаемое в формуле) было найдено безошибочно. На самом деле, вместо 30.6001 можно использовать и 30.601, и 30.61. Для примера, произведение 5*30.6 дает целое число 153. Однако, большинство компьютеров представят 30.6 недостаточно точно, и мы можем получить 152.999998, что после отсечения дробной части даст 152. Вычисленное значение JD будет неверным.

Пример 1

Вычисление Юлианского дня для даты 4.81 Октября 1957, времени запуска первого искусственного спутника Земли.

Имеем: Y = 1957, M = 10, D = 4.81.
Так как M > 2, мы оставляем Y и M неизменными.
Дата дана по Григорианскому календарю, поэтому:

A = INT(1957 / 100) = INT(19.57) = 19

B = 2 - 19 + INT(19 / 4) = 2 - 19 + 4 = -13

JD = INT(365.25 * 6673) + INT(30.6001 * 11) + 4.81 - 13 - 1524.5

JD = 2436116.31


Пример 2

Вычисление Юлианского дня для даты 27 Января 333 года, 12ч

Поскольку M = 1, мы имеем: Y = 333 - 1 = 332 и M = 1 + 12 = 13. Так как дата дана по Юлианскому календарю, принимаем B = 0.

JD = INT(365.25 * 5048) + INT(30.6001 * 14) + 27.5 + 0 - 13 - 1524.5

JD = 1842713.0

Ниже приведен список дат с соответствующими значениями Юлианских дней. Эти данные могут быть полезны при тестировании программ.

 2000 янв  1.52451545.0
 1987 янв 27.02446822.0
 1987 июн 19.52446966.0
 1988 янв 27.02447187.5
 1988 июн 19.52447332.0
 1900 янв  1.02415020.5
 1600 янв  1.02305447.5
 1600 дек 31.02305812.5
  837 апр 10.32026871.8
-1000 июл 12.51356001.0
-1000 фев 29.01355866.5
-1001 авг 17.91355671.4
-4712 янв  1.5      0.0

Если дата лежит в интервале от 1 марта 1900 до 28 февраля 2100, в формуле [1] мы имеем B = -13. В некоторых практических задачах необходимо знать Юлианский день JD0, соответствующий 0.0 января данного года (31.0 декабря предшествующего года). Для года (year) в Григорианском календаре JD0 вычисляется следущим образом:

Y = year - 1

A = INT(Y / 100)

JD0 = INT(365.25 * Y) - A + INT(A / 4) + 1721424.5

Для лет в пределах от 1901 до 2099 включительно формула сводится к:

JD0 = 1721409.5 + INT(365.25 * (year - 1))

Когда год является високосным?

В Юлианском календаре год является високосным (имеет 366 дней), если его численное значение кратно 4. Все другие года считаются обычными (по 365 дней). Например, 900-й и 1236-й годы были високосными, а 750-й и 1429-й — обычными. Те же правила справедливы и для Григорианского календаря, за следующим исключением: годы, оканчивающиеся на два нуля и не кратные 4, такие как 1700-й, 1800-й, 1900-й и 2100-й, являются обычными. Другие же годы, оканчивающиеся на два нуля и делящиеся нацело на 400, являются високосными: как 1600-й, 2000-й, 2400-й и др.

В современной практике встречается термин Модифицированный Юлианский день, MJD (англ. Modified Julian Day), например, при указании элементов орбит искусственных спутников. В противоположность Юлианскому дню, Модифицированный Юлианский день начинается по Гринвичскому средему времени в полночь. Таким образом:

MJD = JD - 2400000.5

И, вследствие этого, дню MJD = 0.0 соответствует дата 0ч 17 ноября 1858 г.

Вычисление календарной даты по Юлианскому дню

Следующий метод справедлив как для положительных, так и для отрицательных значений годов, но не для отрицательного значения Юлианского дня (JD).

Добавляем 0.5 к исходному значению Юлианского дня, и положим Z равной целой части, а F — дробной части полученного числа.

Если Z < 2299161, полагаем A = Z.

Если Z >= 2299161, вычисляем:

α = INT((Z - 1867216.25) / 36524.25)

A = Z + 1 + α - INT(α / 4)

Далее:

B = A + 1524

C = INT((B - 122.1) / 365.25)

D = INT(365.25 * C)

E = INT((B - D) / 30.6001)

День месяца (с десятичной дробной частью) равен:

B - D - INT(30.6001 * E) + F

Номер месяца есть:

E -  1 , если E > 14
E - 13 , если E = 14 или 15

Номер года есть:

C - 4716 , если m > 2
E - 4715 , если m = 1 или 2

В противоположность тому, что было сказано ранее про формулу [1], в формуле для E число 30.6001 не может быть заменено на 30.6, даже если вычисления на компьютере производятся точно. В противном случае мы можем получить 0-е февраля вместо 31 января или 0-е апреля вместо 31 марта.

Пример 3

Вычисление календарной даты, соответствующей JD = 2436116.31.

2436116.31 + 0.5 = 2436116.81
Z = 2436116
и F = 0.81
Поскольку Z > 2299161, имеем:

α = INT((2436116 - 1867216.25) / 36524.25) = 15

A = 2436116 + 1 + 15 - INT(15 / 4) = 2436129

Далее находим:

B = 2437653   C = 6673   D = 2437313   E = 11

День месяца d = 4.81

Месяц m = E - 1 = 10 (так как E < 14)

Год y = C - 4716 = 1957 (так как m > 2)

Отсюда искомая дата: 4.81 Октября 1957.

Интервал между датами

Число дней между двумя датами может быть найдено при помощи разности соответствующих значений Юлианских дней.

Пример 4

Периодическая комета Галлея проходила через перигелий орбиты 20 Апреля 1910 и 9 Февраля 1986. Сколько дней прошло между этими двумя проходжениями?

1910 апр 20.0 соответствует Юлианский день JD = 2418781.5
1986 фев  9.0 соответствует Юлианский день JD = 2446470.5

Разница равна 27689 дням.

День недели

День недели, соответствующий заданной дате, может быть рассчитан следующим образом. Нужно вычислить JD для этой даты в 0ч, добавить 1.5, затем поделить результат на 7. Остаток от деления будет соответствовать дню недели, а именно: 0 — воскресенье, 1 — понедельник, 2 — вторник, 3 — среда, 4 — четверг, 5 — пятница, 6 — суббота.
Последовательность дней недели не была нарушена реформой Григорианского календаря. Так, в 1582 году, за 4-м октября (четверг) последовало 15-е октября (пятница).

Пример 5

Найти день недели для даты 30 Июня 1954.

1954 июн 30.0 соответствует Юлианский день JD = 2434923.5
2434923.5 + 1.5 = 2434925

Остаток от деления 2434925 на 7 равен 3. Отсюда день недели — среда.

День года

Порядковый номер дня в году N может быть рассчитан с помощью следующей формулы.

N = INT((275 * M) / 9) - K * INT ((M + 9) / 12) + D - 30

где M – номер месяца, D – день месяца, и:

K = 1 для високосного года
K = 2 для обычного года

N принимает целые значения от 1 для 1 января до 365 (или 366 для високосного года) для 31 декабря.

Пример 6

Найти день года для даты 14 Ноября 1978

Обычный год, M = 11, D = 14, K = 2
Получаем N = 318.


Пример 7

Найти день года для даты 22 Апреля 1988

Високосный год, M = 4, D = 22, K = 1
Получаем N = 113.

Теперь обсудим обратную проблему: пусть известен номер дня в году N, и необходимо найти соответствующую календарную дату, а именно номер месяца M и день месяца D. Ниже приведен алгоритм этой задачи.
Как и выше, примем:

K = 1 для високосного года
K = 2 для обычного года

M = INT((9 * (K + N)) / 275 + 0.98)

Если N < 32, тогда M = 1.

D = N - INT(275 * M / 9) + K * INT((M + 9) / 12) + 30

В начало статьи