Z PRACOWNI I OBSERWATORIÓW

Postępy Astronomii
Tom XXXV (1987), Zeszyt 4, 275–279.


DNI JULIANSKIE I DATY KALENDARZOWE

Kazimierz M. Borkowski

Katedra Radioastronomii Uniwersytetu M. Kopernika (Toruń)
(Otrzymano 29 września 1987 r.)

S t r e s z c z e n i e — W pracy przedstawiam proste algorytmy Hatchera na przeliczanie dat kalendarza gregoriańskiego i juliańskiego na dni juliańskie i odwrotnie. Ich zmodyfikowaną wersję obejmującą daty od 100100 r.p.n.e. przytaczam w postaci podprogramów napisanych w języku FORTRAN. Poprawność ich działania przetestowano na przestrzeni ok. 200 tys. lat.

JULIAN DAY NUMBERS AND CALENDAR DATES. S u m m a r y — The simple algorithms of Hatcher (1984, 1985) serving the purpose of forward and reverse transformation between calendar dates and the Julian day numbers are presented. A slightly modified version of the algorithms implemented in FORTRAN programming language has been tested to be valid for all dates since the year 100100 BC. The printouts of these subroutines are appended.

Juldat-rus.gif


W wielu zagadnieniach astronomicznych pojawia się problem przeliczania daty kalendarzowej na inną, ciągłą skalę czasu. W przypadku zjawisk historycznych wchodzą w grę także różne kalendarze i wówczas sprawa przeliczeń dat znacznie wykracza poza krąg astronomów. Ci ostatni w swej praktyce używają równomiernej ciągłej rachuby czasu wyrażanej tzw. dniami albo datą juliańską (powszechne oznaczenie JD od Julian Day [number]), której jednostką jest doba (średnia słoneczna), a początkiem skali południe (w Greenwich) 1 stycznia –4712 r. (tzn. 4713 r.p.n.e.) według kalendarza juliańskiego odpowiednio rozszerzonego wstecz. Niekiedy stosuje sie w tym samym celu system zmodyfikowanych dni juliańskich (MJD):

MJD = JD – 2400000,5,(1)

w którym początek doby przypada na północ, a na oznaczenie współczesnych dat wystarczy 5 cyfr. Ze wzoru (1) wynika, że początkiem skali MJD jest północ 17 listopada 1858 r. według kalendarza gregoriańskiego.

Umiejętność przeliczenia dat danego kalendarza na juliańską rachubę dni pozwala na łatwe określanie czasu upływającego między dwoma epokami (datami) z różnicy dni juliańskich. Dni juliańskie umożliwiają też proste znajdowanie dni tygodnia:

dzień tygodnia = 1 + JD mod 7, (2)

gdzie x mod y oznacza resztę z dzielenia x przez y. Ze wzoru (2) dostaje się liczby od 1 do 7, którym odpowiadają kolejne dni tygodnia: od poniedziałku do niedzieli.

Innym niezmiernie ważnym zastosowaniem juliańskiej rachuby dni jest wykorzystanie jej jako podstawy do powiązania dat różnych kalendarzy. Można powiedzieć, używając słów L. Idelera (znanego niemieckiego astronoma i chronologa ub. w.), że dopiero od wprowadzenia tej rachuby ,,w chronologii nastała światłość i porządek" (Seleshnikov 1977, s. 202). W tym opracowaniu ograniczę się do dyskusji tylko dwóch, bez wątpienia najważniejszych, kalendarzy: obecnie (od 15 października 1582 r.) u nas obowiązującego gregoriańskiego oraz juliańskiego, który był używany w Polsce wcześniej (do 4 października 1582 r. według tego kalendarza), ale w wielu krajach używano go znacznie dłużej (w niektórych jeszcze w XX w.).

Dość proste reguły wymienionych kalendarzy pozwalają na ścisłe powiązanie ich dat za pośrednictwem JD dla dowolnego dnia. Jednak w praktyce takie przeliczenia nie są wcale sprawą trywialną, czego dowodzi chociażby mnogość względnie złożonych algorytmów i zbiorów reguł, z którymi spotykamy się w literaturze (np. Oesterwinter i Cohen 1972, Newton 1976, Bertin 1977, Almanac for Computers 1979-1987, Van Flandern i Pulkkinen 1979, Meeus 1980, 1982, Gossler 1980, Prószyński 1983, Hatcher 1984, 1985). Bardziej znane roczniki astronomiczne, a także wiele wydawnictw książkowych (np. Explanatory Supplement 1961, Astronomical Almanac, Astronomicheskij Ezhegodnik SSSR, Seleshnikov 1977, Butkevich i Zelikson 1984) przedstawiają specjalnie opracowane tabele, z których można odczytać JD odpowiadający poszukiwanej dacie kalendarza juliańskiego lub gregoriańskiego, ale wygoda tego sposobu przeliczania pozostawia wiele do życzenia.

Wydaje się, że najbardziej ogólne i jednocześnie stosunkowo proste algorytmy opracował Hatcher (1985), dlatego warto je spopularyzować. Nadają się one do zaprogramowania wprost na podręcznym kalkulatorze lub komputerze. Przy oganiczeniu się do dwóch wczesniej wymienionych kalendarzy algorytmy te można istotnie uprościć i taką postać przedstawiam niżej.

Oznaczmy przez L, M i N lata, miesiące i dni daty kalendarza gregoriańskiego lub juliańskiego. W celu obliczenia dnia juliańskiego wykonujemy następujące rachunki:

L' = L + 4716 – int[(14 – M)/12], (3)
M' = (M + 9) mod 12, (4)
G = 0,    dla kalendarza juliańskiego zaś
= int{3int[(L' + 184)/100]/4} – 38,
(5a)

dla gregoriańskiego. Wtedy

JD = int(365,25L') + int(30.6M' + 0.4) + N – G – 1402. (6)

We wzorach powyższych int(y) oznacza część całkowitą y (entier y). Obliczone w ten sposób JD jest dniem juliańskim w uniwersalne południe daty.

Przy odtwarzaniu daty kalendarzowej z dnia juliańskiego postępujemy następująco: kładziemy ponownie 0 na G w przypadku kalendarza juliańskiego a dla gregoriańskiego podstawiamy w tym miejscu wyrażenie

int{3int[(JD + 68569)/36524,25]/4} – 38. (5b)

i dalej (dla obu kalendarzy)

J = 4(JD + G + 1401) + 3, (7)
I = 5int[(J mod 1461)/4] + 2, (8)
N = int([I mod 153]/5) + 1, (9)
M = [int(I/153) + 2] mod 12 + 1 oraz (10)
L = int(J/1461) – 4716 + int[(14 – M)/12]. (11)

Wspomniane wcześniej uproszczenia oryginalnego algorytmu są przede wszystkim następstwem podstawienia wartości liczbowych w miejsce parametrów zależnych od rodzaju kalendarza. Wprawdzie autor tego nie zaznaczył w swej pracy, ale nie jest trudno zauważyć, że jego algorytmy dają poprawne wyniki dla wszystkich dat po roku –4716, co obejmuje wszystkie dodatnie wartości JD. Ograniczenie to wynika ze sposobu zdefiniowania funkcji ,,int" i "mod" tak, jak zwykle definiuje się te funkcje w standartowych językach programowania i kalkulatorach. Dla poprawności działania algorytmów argumenty tych funkcji powinny przyjmować wartości nieujemne. Tą niewielką niedogodność można ominąć albo przez nowe zdefiniowanie (w programie liczącym) funkcji ,,int", albo przez wprowadzenie innych stałych liczbowych we wzorach (3–11).

Szególnie elegancką implementację algorytmu Hatchera dostaje się w języku FORTRAN przez wykorzystanie 4-bajtowej arytmetyki liczb całkowitych, w której funkcja ,,int" realizuje się automatycznie. W Dodatku zamieszczam wydruk przykładowych podprogramów fortranowskich realizujących przedstawiony algorytm w nieco zmodyfikowanej postaci, umożliwiającej przeliczenia także znacznie odleglejszych dat historycznych (w danym przypadku od 100100 r.p.n.e. włącznie). Z natury fortranowskich liczb całkowitych wynika drugie ograniczenie zakresu stosowalności podanych podprogramów do kilku milionów lat. Wydaje się, że owe kilka milionów poczynając od 100 tys. lat p.n.e. zadowoli praktycznie wszystkich potencjalnych użytkowników. Dodać jeszcze wypada, że podprogramy ,,JD" i ,,DATA" działają na JD nie przebiegającym cyklicznie z juliańskim okresem 2914695 dni (7980 lat juliańskich), jak to jest w idei J.J. Scaligera, lecz przyjmującym wartości ujemne przed 1–stycznia 4712 r. i dodatnie po tej dacie kalendarza juliańskiego.

Programy Dodatku zostały przetestowane na IBM PC (kompilatory Microsoft i Lahey). Test funkcji ,,JD" polegał na porównaniu uzyskanych wartości numerycznych z podobnymi wynikami analogicznej funkcji opartej na algorytmie Newtona (1976, też Prószyński 1983). Obie implementacje mają w FORTRANie porównywalną złożoność z tym, że nasza ,,JD" jest o 35 – 65 % (zależnie od kalendarza) szybsza. Oba algorytmy dały takie same wartości JD dla pierwszego dnia (N = 1) wszystkich miesięcy każdego roku w okresie ok. 200 tys. lat ześrodkowanym na początku naszej ery, a sprawdziłem to osobno dla obu kalendarzy. Drugi podprogram, ,,DATA", przetestowałem podobnie, ale względem ,,JD". Ponadto, porównałem niektóre wyniki z dostępnymi tabelami JD oraz danymi cytowanymi w literaturze fachowej i popularnej. Nieoczekiwanie, ten ostatni wyrywkowy test wypadł niekorzystnie dla ... literatury. Okazało się np., że pół tabeli Kitchina (1984) zawiera błąd daty (albo JD) o wartości pełnego roku (przypisanie ujemnego roku rokowi p.n.e.). Niektóre daty historyczne mają szczególną wagę, gdyż wiąże się z nimi początki określonych systemów rachuby czasu. Oto poprawna korespondencja dni juliańskich i dat kalendarzowych (rok, miesiąc, dzień) dla kilku er, którym w kilku źródłach (wskazanych symbolami w ostatniej kolumnie tabelki, gdzie Z = Zajdler 1977, K = Kitchin 1984, a S = Seleshnikov 1977, s. 201) przypisano błędny dzień juliański:

                 Kalendarz
    JD     juliański  gregoriański   Era (literatura)

-290495   -5508 09 01  -5508 07 19   bizantyjska (Z)
      0   -4712 01 01  -4713 11 24   Scaligera (K)
1438171    -775 07 01   -775 06 23   olimpiad (Z)
1446501    -752 04 21   -752 04 13   warrońska (Z)
1721424       1 01 01      0 12 30   chrześcijańska (S,Z)
2375840    1792 09 11   1792 09 22   republikańska (S,Z)
2378862    1800 12 20   1801 01 01   nowa era astronomiczna (Z)

Cała tabelka dotyczy południa daty, ale w definicji początku ostatniej z tych er jest północ wypisanej daty, dlatego bardziej właściwe JD byłoby w tym miejscu 2378861,5.


Autor wyraża podziękowania za pomoc finansową w ramach resortowego problemu badawczego RPBR Nr RR.I.11/2.


LITERATURA

,,Almanac for Computers for the Year 1979", Nautical Almanac Office,USNO, Washington (także dalsze roczniki, do 1987).
Bertin F.C., 1977, ,,Programmes for Pocket Calculators HP-67 and HP-97 in the Field of Theoretical and Observational Astronomy", Leuven University Press.
Butkevich A.V., Zelikson M.S., 1984, ,,Vechnye kalendari", Nauka, Moskva (od s. 110).
,,Explanatory Supplement to the Astronomical Ephemeris", 1961, London (HMSO) (od s. 436).
Gossler M., 1980, Astron. Nachr. 301, 191.
Hatcher D.A., 1984, Q.J.R.A.Soc. 25, 53.
Hatcher D.A., 1985, Q.J.R.A.Soc. 26, 151.
Kitchin C.R., 1984, ,,Astrophysical Techniques", Adam Hilger Ltd, Bristol, s. 408.
Meeus J., 1980, L'Astronomie 94, 541.
Meeus J., 1982, ,,Astronomical Formulae for Calculators", Willmann-Bell, Inc., Richmond (Va).
Newton R.R., 1976, ,,Ancient Planetary Observations", John Hopkins University Press, Baltimore and London, s. 62.
Oesterwinter C., Cohen C.J., 1972, Cel. Mech. 5, 317.
Prószyński M., 1983, w: ,,Czas", Bibl. Delty, 7F, 55.
Seleshnikov S.I., 1977, ,,Istoriya kalendarya i khronologiya", Nauka, Moskva.
Zajdler L., 1977, ,,Dzieje zegara", P.W. Wiedza Powszechna, Warszawa, s. 78.
Van Flandern T.C., Pulkkinen K.F., 1979, Astroph. J. Supp. Ser. 41, 391.


DODATEK

        FUNCTION JD(L,M,N,J1G0)

C   OBLICZA DZIEN JULIANSKI Z DATY KALENDARZA GREGORIANSKIEGO [J1G0
C  = 0] LUB JULIANSKIEGO [J1G0 = 1]  (L = ROK, M = MIESIAC,     N =
C  DZIEN MIESIACA). ALGORYTM DZIALA POPRAWNIE OD 1 MARCA -100100 R.
C  (OBU KALENDARZY).
C
      JD=(L+(M-8)/6+100100)*1461/4+(153*MOD(M+9,12)+2)/5+N-34840408
      IF(J1G0.LE.0)          JD = JD-(L+100100+(M-8)/6)/100*3/4+752
        RETURN
          END

        SUBROUTINE DATA(JD,L,M,N,J1G0)

C   OBLICZA DATE GREGORIANSKA LUB JULIANSKA  (L = ROK, M = MIESIAC 
C  [STYCZEN: M=1], N = DZIEN MIESIACA)  Z DNIA JULIANSKIEGO (JD) W
C  POLUDNIE.  STOSOWALNOSC OD JD = -34839655,  TJ. OD ROKU -100100
C  KALENDARZA GREGORIANSKIEGO [J1G0=0] ALBO JULIANSKIEGO [J1G0=1].
C
      J = 4*JD+139361631
      IF(J1G0.LE.0)       J = J+(4*JD+183187720)/146097*3/4*4-3908
      I = MOD(J,1461)/4*5+308
      N = MOD(I,153)/5+1
      M = MOD(I/153,12)+1
      L = J/1461-100100+(8-M)/6
        RETURN
          END