static PyObject* astrology_swe_utc_to_jd(PyObject *self, PyObject *args) { int y, m, d, h, mi; double s; int calflag; if (!PyArg_ParseTuple(args, "iiiiidi", &y, &m, &d, &h, &mi, &s, &calflag)) return NULL; double dret[2]; char serr[AS_MAXCH]; swe_utc_to_jd(y, m, d, h, mi, s, calflag, dret, serr); return Py_BuildValue("(dd)(s)", dret[0], dret[1], serr); }
/* * Input: tjd_et Julian day number, terrestrial time (ephemeris time). * gregfalg Calendar flag * Output: UTC year, month, day, hour, minute, second (decimal). * * - Before 1 jan 1972 UTC, output UT1. * Note: UTC was introduced in 1961. From 1961 - 1971, the length of the * UTC second was regularly changed, so that UTC remained very close to UT1. * - From 1972 on, output is UTC. * - If delta_t - nleap - 32.184 > 1, the output is UT1. * Note: Like this we avoid errors greater than 1 second in case that * the leap seconds table (or the Swiss Ephemeris version) has not been * updated for a long time. */ void FAR PASCAL_CONV swe_jdet_to_utc(double tjd_et, int32 gregflag, int32 *iyear, int32 *imonth, int32 *iday, int32 *ihour, int32 *imin, double *dsec) { int i; int second_60 = 0; int iyear2, imonth2, iday2, nleap, ndat, tabsiz_nleap; double d, tjd, tjd_et_1972, tjd_ut, dret[10]; /* * if tjd_et is before 1 jan 1972 UTC, return UT1 */ tjd_et_1972 = J1972 + (32.184 + NLEAP_INIT) / 86400.0; d = swe_deltat(tjd_et); tjd_ut = tjd_et - swe_deltat(tjd_et - d); if (tjd_et < tjd_et_1972) { swe_revjul(tjd_ut, gregflag, iyear, imonth, iday, &d); *ihour = (int32) d; d -= (double) *ihour; d *= 60; *imin = (int32) d; *dsec = (d - (double) *imin) * 60.0; return; } /* * minimum number of leap seconds since 1972; we may be missing one leap * second */ tabsiz_nleap = init_leapsec(); swe_revjul(tjd_ut-1, SE_GREG_CAL, &iyear2, &imonth2, &iday2, &d); ndat = iyear2 * 10000 + imonth2 * 100 + iday2; nleap = 0; for (i = 0; i < tabsiz_nleap; i++) { if (ndat <= leap_seconds[i]) break; nleap++; } /* date of potentially missing leapsecond */ if (nleap < tabsiz_nleap) { i = leap_seconds[nleap]; iyear2 = i / 10000; imonth2 = (i % 10000) / 100;; iday2 = i % 100; tjd = swe_julday(iyear2, imonth2, iday2, 0, SE_GREG_CAL); swe_revjul(tjd+1, SE_GREG_CAL, &iyear2, &imonth2, &iday2, &d); swe_utc_to_jd(iyear2,imonth2,iday2, 0, 0, 0, SE_GREG_CAL, dret, NULL); d = tjd_et - dret[0]; if (d >= 0) { nleap++; } else if (d < 0 && d > -1.0/86400.0) { second_60 = 1; } } /* * UTC, still unsure about one leap second */ tjd = J1972 + (tjd_et - tjd_et_1972) - ((double) nleap + second_60) / 86400.0; swe_revjul(tjd, SE_GREG_CAL, iyear, imonth, iday, &d); *ihour = (int32) d; d -= (double) *ihour; d *= 60; *imin = (int32) d; *dsec = (d - (double) *imin) * 60.0 + second_60; /* * For input dates > today: * If leap seconds table is not up to date, we'd better interpret the * input time as UT1, not as UTC. How do we find out? * Check, if delta_t - nleap - 32.184 > 0.9 */ d = swe_deltat(tjd_et); d = swe_deltat(tjd_et - d); if (d * 86400.0 - (double) (nleap + NLEAP_INIT) - 32.184 >= 1.0) { swe_revjul(tjd_et - d, SE_GREG_CAL, iyear, imonth, iday, &d); *ihour = (int32) d; d -= (double) *ihour; d *= 60; *imin = (int32) d; *dsec = (d - (double) *imin) * 60.0; } if (gregflag == SE_JUL_CAL) { tjd = swe_julday(*iyear, *imonth, *iday, 0, SE_GREG_CAL); swe_revjul(tjd, gregflag, iyear, imonth, iday, &d); } }