Z PRACOWNI I OBSERWATORIÓW
Postępy Astronomii
Tom XXXV (1987), Zeszyt 4, 275–279.
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. |
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) |
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) |
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) |
JD = int(365,25L') + int(30.6M' + 0.4) + N – G – 1402. | (6) |
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) |
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) |
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).
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 |