/**//*
该程序主要计算从1970年开始到开机当日经过的秒数,作为开机时间
该函数与标准C函数提供的mktime()函数的功能完全一样
*/
#incldue <time.h>
#define MINUTE 60
#define HOUR (60 * MINUTE)
#define DAY (24 * HOUR)
#define YEAR (356 * DAY)
//下面以年为界限,定义了每个月开始时的秒数时间
static int month[12]={
0 ,
DAY*(32) ,
DAY*(32 + 29) ,
DAY*(32 + 29 + 31) ,
DAY*(32 + 29 + 31 + 30) ,
DAY*(32 + 29 + 31 + 30 + 31) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30 + 31) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30 + 31 + 31) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31) ,
DAY*(32 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)
}
long kernel_mktime(struct tm * tm)
{
long res ;
int year ;
year = tm->tm_year - 70 ;
res = YEAR * year + DAY *((year + 1)/4) ; //加上在该年之前所过的闰年数木
res += month[tm->tm_mon] ; //再加上当前月份之前的月份所有的秒数
//如果不是闰年,我们就进行调整,把多加的一条去掉
if(tm->tm_mon > 1 && ((year + 2) %4))
res -= DAY ; //如果当前的月超过了2月,且本身就是闰年,那么需要减去一天
res += DAY * (tm->tm_mday - 1) ;
res += HOUR * tm->tm_hour ;
res += MINUTE * tm->tm_min ;
res += tm->tm_sec ;
return res ; //得到的结果就是从1970年开始到现在的秒数。
}
该代码中,只有一个核心方法,就是要得到现在的时间到1970年经过的秒数。