RTKlib中的GPS历法格里历转秒的表示方法

RTKlib中的GPS历法格里历转秒的表示方法


上一篇说的是GPS秒转格里历链接: RTKlib中的GPS秒转历法格里历的表示方法。这一篇说说反向——GPS历法格里历转秒。

/* 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;
}

这里定义了一个doy数组,day of year,每一个元素代表第几个月的第一天的年积日。比如第一个元素1代表这1月的第一天是年积日第几天,这里是平年365天的情况。

中间的if语句判断了异常情况,不在1970到2099年之间或者月份不在1到12月之间。

days=(year-1970)*365+(year-1969)/4+doy[mon-1]+day-2+(year%4==0&&mon>=3?1:0);

计算当前天数的前一天的天数day时,注意mon是1-12,所以要减1,day是该月内的日数,包括当前天,由于doy数组也包括当前天,所以要减2。(year-1969)/4是计算有多少个闰年,从1969到1972算一个周期,计算有多少个周期,由于不清楚当前年份是不是闰年,所以加了一句year%4==0&&mon>=3?1:0,同时判断是不是闰年并已经到三月份了才会加1天。

sec=(int)floor(ep[5]);

floor是向下取整,因为ep[5]加上了秒的小数位(不足一秒)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值