周-周内秒转化为utc时间 c语言实现

用过北斗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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值