81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
#include "get_utc_time.h"
|
|
|
|
gtime_t epoch2time(const double *ep)
|
|
{
|
|
const int doy[] = {1,32,60,91,121,152,182,213,244,274,305,335};
|
|
gtime_t time={0};
|
|
int days, sec, year=(int)ep[0], mon=(int)ep[1], day=(int)ep[2];
|
|
|
|
if (year<1970||2099<year||mon<1||12<mon)
|
|
return time;
|
|
|
|
/* leap year if year%4==0 in 1901-2099 */
|
|
days=(year-1970)*365+(year-1969)/4+doy[mon-1]+day-2+(year%4==0&&mon>=3?1:0); //2´ú±íǰһÌì
|
|
sec=(int)floor(ep[5]);
|
|
time.time=(time_t)days*86400+(int)ep[3]*3600+(int)ep[4]*60+sec;
|
|
time.sec=ep[5]-sec;
|
|
return time;
|
|
}
|
|
|
|
gtime_t gpst2time(int week, double sec)
|
|
{
|
|
gtime_t t=epoch2time(gpst0);
|
|
|
|
if (sec<-1E9||1E9<sec) sec=0.0;
|
|
t.time+=86400*7*week+(int)sec;
|
|
t.sec=sec-(int)sec;
|
|
return t;
|
|
}
|
|
|
|
gtime_t timeadd(gtime_t t,double sec)
|
|
{
|
|
double tt;
|
|
t.sec+=sec;tt=floor(t.sec);t.time+=(int)tt;t.sec-=tt;
|
|
return t;
|
|
}
|
|
|
|
gtime_t GPSTime2UTCTime(int week,double sec,double leapsec)
|
|
{
|
|
gtime_t gpst=gpst2time(week,sec);
|
|
return timeadd(gpst,-leapsec);
|
|
}
|
|
|
|
uint16_t get_utc_time(uint16_t GPSweek)
|
|
{
|
|
gtime_t GPSTime;
|
|
struct tm * gpstimeinfo;
|
|
|
|
GPSTime = GPSTime2UTCTime(GPSweek, 0, LEAPS);
|
|
gpstimeinfo = gmtime(&GPSTime.time);
|
|
|
|
double year = gpstimeinfo->tm_year + 1900;
|
|
double month = gpstimeinfo->tm_mon + 1;
|
|
return year;
|
|
}
|
|
|
|
uint16_t get_utc_year(uint16_t GPSweek)
|
|
{
|
|
gtime_t GPSTime;
|
|
struct tm * gpstimeinfo;
|
|
|
|
GPSTime = GPSTime2UTCTime(GPSweek, 0, LEAPS);
|
|
gpstimeinfo = gmtime(&GPSTime.time);
|
|
|
|
double year = gpstimeinfo->tm_year + 1900;
|
|
return year;
|
|
}
|
|
|
|
uint8_t get_utc_month(uint16_t GPSweek)
|
|
{
|
|
gtime_t GPSTime;
|
|
struct tm * gpstimeinfo;
|
|
|
|
GPSTime = GPSTime2UTCTime(GPSweek, 0, LEAPS);
|
|
gpstimeinfo = gmtime(&GPSTime.time);
|
|
|
|
double year = gpstimeinfo->tm_year + 1900;
|
|
double month = gpstimeinfo->tm_mon + 1;
|
|
return month;
|
|
}
|
|
|