Data juliańska
Data juliańska, dni juliańskie – liczba dni, która upłynęła od 1 stycznia roku 4713 p.n.e., według kalendarza juliańskiego (przedłużonego odpowiednio wstecz), godz. 12:00 czasu uniwersalnego (czasu południka zerowego). Datę tę ustalił w 1583 r. Joseph Scaliger, nazywając na cześć swojego ojca Juliusza Cezara Scaligero nowy sposób liczenia dat „dniami juliańskimi”. Według tej rachuby można przypisać każdemu dniowi następującemu po tej dacie jednoznaczny numer stosowany głównie do obliczeń astronomicznych. Datę juliańską najczęściej oznacza się symbolem JD.
Podstawy wyznaczania daty juliańskiej
[edytuj | edytuj kod]Doby zaczynają się w południe, ponieważ do r. 1925 doba astronomiczna zaczynała się w południe, o godz. 12:00 czasu UTC.
Aby wyrazić w tej rachubie dokładniej czas jakiegoś zdarzenia, do juliańskiego numeru dnia dodaje się część ułamkową określającą ułamek doby, jaki upłynął od godziny 12:00 w południe. Taką ulepszoną, ciągłą rachubę czasu nazywa się datami juliańskimi.
Datę juliańską dla czasu uniwersalnego UT1 i czasu uniwersalnego skoordynowanego UTC oznacza się skrótem JD (Julian Date). Dla czasu efemeryd oznacza się ją skrótem JED (Julian Ephemeris Date). Podając wartość JD warto zaznaczyć, według jakiej rachuby czasu określono porę dnia.
Z powodu tego, że daty juliańskie liczy się od południa, a liczby odpowiadające naszym czasom są bardzo duże, coraz częściej używa się zmodyfikowanych dat juliańskich MJD (Modified Julian Date), zdefiniowanych następująco:
MJD = JD – 2400000,5.
Przykład zastosowania
[edytuj | edytuj kod]data gregoriańska dni juliańskie (1) 1074.06.01 18:35 – 2113488,2746855323 (2) 2005.04.19 02:04 – 2453479,5866961805
Aby obliczyć ile dni minęło między wyżej wymienionymi datami (1) i (2), wystarczy odjąć od siebie dni juliańskie (liczbę mniejszą od większej). Po wykonaniu operacji odejmowania stwierdzamy, że między datą (1) i datą (2) jest 339991,31201 dni.
Dni juliańskie są używane prawie we wszystkich skomplikowanych algorytmach astronomicznych, gdyż jest to łatwy sposób liczenia. System dni juliańskich używany jest także wśród obserwatorów gwiazd zmiennych oraz w międzynarodowym systemie wyznaczania czasu uniwersalnego.
Algorytm obliczania daty juliańskiej
[edytuj | edytuj kod]Założenia wstępne
[edytuj | edytuj kod]W urzędowej rachubie lat brakuje roku = 0. Nasza era rozpoczęła się 1 stycznia roku 1., a ostatni dzień p.n.e. był dniem 31 grudnia roku -1. Stąd też biorą się nieporozumienia na tle roku 2000. Pierwszym rokiem wieku XX był rok 1901, a rok 2000 był ostatnim rokiem tego wieku i drugiego tysiąclecia n.e. Pierwszym rokiem XXI wieku (i trzeciego tysiąclecia) był rok 2001.
Astronomowie przyjmują numerację lat ery nowożytnej, taką, jak urzędowa, ale lata ery starożytnej liczone są, dla wygody rachunków, od zera. Tak więc np. według urzędowej rachuby lat Rzym został zbudowany w r. 753 p.n.e. (-753), ale według rachuby astronomicznej zdarzyło się to w roku -752.
Przy obliczaniu daty juliańskiej dla lat p.n.e. należy więc numer roku zwiększyć o 1. Kolejnym krokiem jest zmiana numerów miesięcy. Miesiące od marca do grudnia mają numer normalny (3 – 12), natomiast styczeń i luty traktujemy jako miesiąc 13. i 14. roku poprzedniego. Należy ich numer zwiększyć o 1, a numer roku, oczywiście zmniejszyć o 1.
Obliczenia daty juliańskiej
[edytuj | edytuj kod]R: rok M: miesiąc D: dzień G: godzina m: minuta S: sekunda JD: dni juliańskie
JD’ = Int(365,2425 *R) + Int(30,6001 * M) + D + 1720994,5 Dokonuje się zamiany pory dnia na ułamek doby: T = G/24 + m/(60 * 24) + S/(3600 * 24)
Dla dat po 1.10.1582 r. oblicza się liczbę lat przestępnych według wzoru: P = Int(Int(R/100)/4) – Int(R/100) + 2
Ostatecznie powstaje wzór na datę juliańską JD = JD’ + P + T;
Wzór ten nadaje się do obliczania dat juliańskich dla okresu od roku 8 n.e. Dla wcześniejszych lat trzeba uwzględnić lata przestępne wprowadzane w tym okresie.
Objaśnienie: funkcja Int(x) wyznacza część całkowitą wartości x po obcięciu części ułamkowej np. int(4,87) = 4.
Algorytmy astronomiczne
[edytuj | edytuj kod]Obliczanie dni juliańskich z daty kalendarza gregoriańskiego
[edytuj | edytuj kod]R: rok M: miesiąc D: dzień JD: dni juliańskie
X = (M + 9) / 12 A = 4716 + R + Int(X) Y = 275 * M / 9 V = 7 * A / 4 B = 1729279,5 + 367 * R + Int(Y) – Int(V) + D Q = (A + 83) / 100 C = Int(Q) W = 3 * (C + 1) / 4 E = Int(W) JD = B + 38 – E
Int(x) – Odcina część ułamkową z liczby x np. int(4,87) = 4
Obliczanie daty kalendarza gregoriańskiego z dni juliańskich
[edytuj | edytuj kod]R – rok M – miesiąc D – dzień JD – dni juliańskie
W = JD + 0.5 = 2441925 X = INT (W) = 2441925 U = W – X = 0 Y = INT ((X + 32044,5) / 36524,25) = 67 Z = X + Y – INT (Y / 4) – 38 = 2441938 A = Z + 1524 = 2443462 B = INT ((A – 122,1) / 365,25) = 6689 C = A – INT (365,25 * B) = 305 E = INT (C / 30,61) = 9 F = INT (E / 14) = 0 R = B – 4716 + F = 1973 M = E – 1 – 12 * F = 8 D = C + U – INT (153 * E / 5) = 30
Int(x) – Odcina część ułamkową z liczby x np. int(4,87) = 4
Uwaga: dla 2415079.5 podaje 29 lutego 1900 zamiast 1 marca 1900 mimo że ten rok nie był przestępny w kalendarzu gregoriańskim. Taka sytuacja zdarza się jednego dnia w roku co 400 lat, począwszy od 1900 roku (w 1500 nie obowiązywał jeszcze kalendarz gregoriański). Aby były uwzględnione te kilka przypadków należy dodać
if (Y % 4 == 2 && Z - Y * 36525 == 4442) {
M++;
D = 1;
} else
D = C + U - (153 * E) / 5;
Ostatecznie, poniższe procedury C działają dla całego okresu 7980 juliańskich lat czyli 2914695 dni począwszy od 4713 p.n.e. = -4712 zarówno dla kalendarza juliańskiego jak i gregoriańskiego począwszy od 1582 do końca cyklu.
double calendar_to_JD(int Y, int M, double D, bool bJulian) {
int A = 4716 + Y + floor((M + 9) / 12);
double B = 1729279.5 + 367 * Y + floor((275 * M) / 9) - floor((7 * A) / 4) + D;
if (bJulian) return B;
int C = floor((A + 83) / 100);
int E = floor((3 * (C + 1)) / 4);
return B + 38 - E;
}
void JD_to_Calendar(double JD, int &Y, int &M, double &D, bool bJulian) {
double W = JD + 0.5;
int X = floor(W);
double U = W - X;
int Z;
int C = 0;
if (bJulian)
Z = X;
else {
C = floor((X + 32044.5) / 36524.25);
Z = X + C - C / 4 - 38;
}
int A = Z + 1524;
int B = floor((A - 122.1) / 365.25);
int Q = A - floor(365.25 * B);
int E = floor(Q / 30.61);
int F = E / 14;
Y = B - 4716 + F;
M = E - 1 - 12 * F;
if (C % 4 == 2 && Z - C * 36525 == 4442) {
M++;
D = 1;
} else
D = Q + U - (153 * E) / 5;
}