/* 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]加上了秒的小数位(不足一秒)。