2457754.5
37.0 // 2017 1 1 2457204.5 36.0 // 2015 7 1 2456109.5 35.0 // 2012 7 1 2454832.5 34.0 // 2009 1 1 |
#define
DAYSEC
86400.0 #define DAYMIN 1440.0 #define DAYHOUR 24.0 /* ----------------------------------------- DATE & TIME ----------------------------------------- */ typedef struct tag_dt{ int nYear; int nMonth; int nDay; int nHour; int nMin; double dSec; } DATETIME; /* ----------------------------------------- Reap second ----------------------------------------- */ typedef struct tag_reap{ double dJD; double dTime; } REAPSEC; /* ----------------------------------------- Reap second table ----------------------------------------- */ REAPSEC tDAT[] = { {2457754.5, 37.0/DAYSEC}, // 2017 1 1 {2457204.5, 36.0/DAYSEC}, // 2015 7 1 {2456109.5, 35.0/DAYSEC}, // 2012 7 1 {2454832.5, 34.0/DAYSEC}, // 2009 1 1 {2453736.5, 33.0/DAYSEC}, // 2006 1 1 {-999999.9, 32.0/DAYSEC} }; /* ============================================= = UTC to TAI = = = = Entry: DATETIME *pUTC = UTC date & time = = double *pdJD_tai = TAI store address = = = = exit; return TAI-UTC sec. unti = = pdJD_tai in JD_TAI = ============================================= */ double utc_tai(DATETIME *pUTC, double *pdJD_tai) { double dJD; double ddAT; double dTimeDay; REAPSEC *ptbl; /* make date to julian & time_day */ dJD = julian(pUTC->nYear, pUTC->nMonth, (double)pUTC->nDay); dTimeDay = pUTC->nHour / DAYHOUR + pUTC->nMin / DAYMIN + pUTC->dSec / DAYSEC; /* get delta AT */ ptbl = tDAT; while( dJD < ptbl->dJD){ ptbl++; } ddAT = ptbl->dTime; /* add deltaAT */ *pdJD_tai = dJD + dTimeDay + ddAT; return (ddAT * DAYSEC); } |
while( dJD < ptbl->dJD){ ptbl++; } |
/* ============================================= = TAI to UTC = ============================================= */ double tai_utc(double dJD_TAI, DATETIME *pUTC) { double dJD; double dDay; double ddAT; REAPSEC *ptbl; bool bFlag = false; /* get deltaAT */ ptbl = tDAT; while( dJD_TAI < (ptbl->dJD + ptbl->dTime)){ ptbl++; } ddAT = ptbl->dTime; /* TAII to UTC */ dJD = dJD_TAI - ddAT; /* check UTC 60s */ if (ptbl != tDAT){ ptbl--; if (dJD >= ptbl->dJD){ /* 60s mode */ dJD -= 1.0 / DAYSEC; bFlag = true; } } /* julian to date */ juian_date(dJD, &pUTC->nYear, &pUTC->nMonth, &dDay); pUTC->nDay = (int)dDay; day_time(dDay - pUTC->nDay, &pUTC->nHour, &pUTC->nMin, &pUTC->dSec); /* make 60s */ if (bFlag){ pUTC->dSec += 1.0; } return (ddAT * DAYSEC); } |
$ ./atime 2015 6 30 23 59
59.987 TAI-UTC 34.000000 TAI 2015/07/01 00:00:33.9870 UTC 2015/06/30 23:59:59.9870 $ ./atime 2015 6 30 23 59 60.987 TAI-UTC 34.000000 TAI 2015/07/01 00:00:34.9870 UTC 2015/06/30 23:59:60.9870 $ ./atime 2015 7 1 0 0 0.987 TAI-UTC 35.000000 TAI 2015/07/01 00:00:35.9870 UTC 2015/07/01 00:00:00.9870 $ ./atime 2014 6 30 23 59 60.987 TAI-UTC 34.000000 TAI 2014/07/01 00:00:34.9870 UTC 2014/07/01 00:00:00.9870 |