gps常用时间系统定义

Unix或POSIX时间戳

它是UNIX或类UNIX系统使用的时间表示方式。一般定义为从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在的总秒数(10位是精确到秒,13位是精确到毫秒)。考虑到闰秒的话,更精确的定义为从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在经过闰秒调整之后的总秒数。

GPS时间

GPST是由全球定位系统中的数十台原子钟维持的一种局部原子时,GPS时间系统在表示时间时所采用的最大时间单位为周(Week,即604800s),其表示时间的方法是从1980年1月6日0时开始起算的周数,以及被称为周内时间的秒数,该秒数从每周周六/周日子夜开始起算,如“1980年1月6日0时0分0秒”用GPS表示法记为“第0周第0秒”;而“2018年5月16日8时30分35秒”用GPS时间表示法记为“第2001周第289835秒”。

rtkcmn代码

epoch2time

/* convert calendar day/time to time -------------------------------------------
* convert calendar day/time to gtime_t struct
* args   : double *ep       I   day/time {year,month,day,hour,min,sec}
* return : gtime_t struct
* notes  : proper in 1970-2037 or 1970-2099 (64bit time_t)
*-----------------------------------------------------------------------------*/
extern 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;
}

该函数调用方式demo如下:

    double ep[6]={2021,12,21,8,27,56}; 
    epoch2time(ep)

该函数实现了UTC时间到Unix时间戳的转换,适用于1901年到2099年之间的时间格式转换,其中代码中的year%4==0 是判断是否是润年,如果是,天数+1,可以看到最后计算得到从1970年1月1日0时0分0秒开始的秒数,和Unix时间的上述定义相同。

gpst2time

static const double gpst0[]={1980,1, 6,0,0,0}; /* gps time reference */

/* gps time to time ------------------------------------------------------------
* convert week and tow in gps time to gtime_t struct
* args   : int    week      I   week number in gps time
*          double sec       I   time of week in gps time (s)
* return : gtime_t struct
*-----------------------------------------------------------------------------*/
extern gtime_t gpst2time(int week, double sec)
{
    gtime_t t=epoch2time(gpst0);
    
    if (sec<-1E9||1E9<sec) sec=0.0;
    t.time+=(time_t)86400*7*week+(int)sec;
    t.sec=sec-(int)sec;
    return t;
}

该函数实现了从GPS时间到Unix时间的转换,gpst0是GPS时间计算的开始时间。

time2gpst

static const double gpst0[]={1980,1, 6,0,0,0}; /* gps time reference */

/* time to gps time ------------------------------------------------------------
* convert gtime_t struct to week and tow in gps time
* args   : gtime_t t        I   gtime_t struct
*          int    *week     IO  week number in gps time (NULL: no output)
* return : time of week in gps time (s)
*-----------------------------------------------------------------------------*/
extern double time2gpst(gtime_t t, int *week)
{
    gtime_t t0=epoch2time(gpst0);
    time_t sec=t.time-t0.time;
    int w=(int)(sec/(86400*7));
    
    if (week) *week=w;
    return (double)(sec-(double)w*86400*7)+t.sec;
}

该函数实现了从Unix时间到GPS时间的转换,gpst0是GPS时间计算的开始时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值