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时间计算的开始时间。