kernel_mktime()函数分析

来源:互联网 发布:类似于唐砖的小说 知乎 编辑:程序博客网 时间:2024/05/09 08:17

/***********时间结构定义********************************/

struct tm {
 int tm_sec; /*秒,0-59*/
 int tm_min; /*分,0-59*/
 int tm_hour;/*时,0-23*/
 int tm_mday;/*天数,1-31*/
 int tm_mon; /*月数,0-11*/
 int tm_year;/*自1900的年数*/
 int tm_wday;/******自星期日的天数0-6****/
 int tm_yday;/*****自1月1日起的天数,0-365*/  
 int tm_isdst;/******是否采用夏时制,采用为正数*/
};

/**kernel_mktime()函数,用于把现在的时间转换成以1970年为基准时间,以秒为单位

就是为系统统一一个时间标准,也就是系统以现在为开机时间

/***************************************************************************/

#define MINUTE 60          /*一分钟的秒数*/
#define HOUR (60*MINUTE)   /*一个小时的秒数*/
#define DAY (24*HOUR)      /*一天的秒数*/
#define YEAR (365*DAY)     /*一年的秒数*/
static int month[12] = {              /*******************************
0,
DAY*(31),                             /********这个数组存放的是********/
DAY*(31+29),                          /********闰年情况的天数**********/
DAY*(31+29+31),                       /********因为闰年二月是29天******/
DAY*(31+29+31+30),                    /********而平年二月是28天********/
DAY*(31+29+31+30+31),
DAY*(31+29+31+30+31+30),
DAY*(31+29+31+30+31+30+31),
DAY*(31+29+31+30+31+30+31+31),
DAY*(31+29+31+30+31+30+31+31+30),
DAY*(31+29+31+30+31+30+31+31+30+31),
DAY*(31+29+31+30+31+30+31+31+30+31+30)
};

/*********************计算的时候是以1970年0月1日0时0分0秒为基准的***/

/********************这里需要注意的就是年和月的处理*****************/
long kernel_mktime(struct tm * tm)
{
long res;
int year;


year = tm->tm_year - 70; 

/***********计算当前时间距1970年有几年***********/
res = YEAR*year + DAY*((year+1)/4);

/***************由于YEAR定义的是365天的秒数,所以

还要加上1970到现在有几个闰年,每个闰年多加1天的秒

数,例如现在是1973年,DAY*((year+1)/4)=1,也就是

说在这段时间中经过的闰年个数是一个(其实就是1972)

,所以要多加上一天年*/

/************************************************/
res += month[tm->tm_mon];

/************************************************/

现在先假设都是闰年,然后就算出0月1日0时0分0秒到当前

月0时0分0秒有几秒,比如现在是0月,就是是0秒,而如果

是7月(其实是8月)就是month[7]秒

*************************************************/
if (tm->tm_mon>1 && ((year+2)%4)) res -= DAY;

/****因为上面是假设当前年是闰年来算0月1日0时0分0秒

到当前月0时0分0秒有几秒,所以必须扣掉不是闰年第二

个月的第29天,比如现在是1973年3月,不是闰年,但是

上面算是是按照DAY*(31+29)加上去的,因此必须扣掉

一天,而如果是1972年3月就不用扣掉一天了。

*************************************************/ 
res += DAY*(tm->tm_mday-1);
res += HOUR*tm->tm_hour;
res += MINUTE*tm->tm_min;
res += tm->tm_sec;
return res;
}