用过北斗gps的都晓得,大部分都要用时间转换的操作:
本文主要是记录: 周-周内秒转换为utc的实现
至于儒略日 周-周内秒 utc等概念去查一查百度很多资料;
这个网址对这些概念有一个大概的描述,对刚接触的人来说个人感觉还不错。
http://www.fmddlmyy.cn/text8.html
http://www.fmddlmyy.cn/text59.html
验证网站:提供了gps local utc等多个时间的动态表格;
http://leapsecond.com/java/gpsclock.htm
#include <stdio.h>
#include <time.h>
const static double gpst0[]={1980,1, 6,0,0,0}; //起始时间
#define LEAPS 18
typedef struct { /* time struct */
time_t time; /* time (s) expressed by standard time_t */
double sec; /* fraction of second under 1 s */
} gtime_t;
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);
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);
}
int main () {
gtime_t GPSTime;
struct tm * gpstimeinfo;
unsigned short gpsweek;
unsigned long gpssec;
unsigned char recv_data[23];
recv_data[8] = 0x73;
recv_data[9] = 0xef;
recv_data[14] = 0x08;
recv_data[15] = 0x5c;
gpsweek = (unsigned short)(recv_data[14] << 8) + recv_data[15];
gpssec = (unsigned long )(recv_data[6] << 24) + (unsigned long)(recv_data[7] << 16)
+ (unsigned long)(recv_data[8] << 8) + recv_data[9];
GPSTime = GPSTime2UTCTime(gpsweek, gpssec, LEAPS);
gpstimeinfo = localtime(&GPSTime.time);
printf("year=%d,mouth=%d,day=%d,hour=%d,min=%d,sec=%d", gpstimeinfo->tm_year+1900, gpstimeinfo->tm_mon+1, gpstimeinfo->tm_mday, gpstimeinfo->tm_hour, gpstimeinfo->tm_min, gpstimeinfo->tm_sec);
return 0;
}