说明
该程序只有一个函数kernel_mktime(),用于计算1970年1月1日0时起到开机日经过的秒数,作为开机时间
(补充:此处的时间计算仅采用了年份的后两位来计算)
代码解析
#include <time.h>
// 时间常数定义
#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),
DAY*(31+29+31+30),
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)
};
// 秒数计算
long kernel_mktime(struct tm * tm)
{
long res;
int year;
// 首先计算当前年份的前一年距离1970-0-0-0的秒数
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;
res += DAY*(tm->tm_mday-1);
res += HOUR*tm->tm_hour;
res += MINUTE*tm->tm_min;
res += tm->tm_sec;
return res;
}