|
|
1.1 root 1: /*
2: * Julian date to year, month, mday, hour, min, sec, yday, wday fields
3: * Algorithm from Duffett-Smith, Practical Astronomy With Your Calculator
4: * Also Meeus, Astronomical Formulae for Calculators
5: */
6: #include "local_misc.h"
7: tm_t *
8: jday_to_tm(jd)
9: jday_t jd;
10: {
11: register tm_t *tp;
12: register long d, s, A, B, F;
13: static tm_t t;
14:
15: tp = &t;
16: d = jd.j_d;
17: s = jd.j_s;
18: if ((s += 86400L/2) >= 86400L) {
19: s -= 86400L; d += 1;
20: }
21: tp->tm_isdst = 0; /* no telling who stepped here */
22: tp->tm_wday = (d+1) % 7;
23: if ((A = d) > 2299160L) {
24: A = (d*100 - 186721625L) / 3652425L;
25: A = d + 1 + A - (A / 4);
26: }
27: B = A + 1524;
28: tp->tm_year = (B*100 - 12210) / 36525L;
29: B -= (tp->tm_year * 36525L) / 100;
30: tp->tm_mon = (B * 10000) / 306001L;
31: F = (306001L * tp->tm_mon) / 10000;
32: tp->tm_mday = B - F;
33: tp->tm_yday = B - (tp->tm_mon >= 14 ? 428+1 : 61+2+1);
34: tp->tm_mon -= tp->tm_mon > 13 ? 13 : 1;
35: tp->tm_year -= tp->tm_mon > 2 ? 4716 : 4715;
36: if (tp->tm_mon > 2 && isleapyear(tp->tm_year))
37: ++tp->tm_yday;
38: tp->tm_sec = s % 60;
39: s /= 60;
40: tp->tm_min = (unsigned int)s % 60;
41: tp->tm_hour = (unsigned int)s / 60;
42: /* Correct for tm_t bias */
43: tp->tm_year -= 1900;
44: tp->tm_mon -= 1;
45: return tp;
46: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.