您的位置:首页 > 其它

kernel_mktime()函数分析

2008-01-17 12:57 302 查看
/***********时间结构定义********************************/

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: