涉及到的数据结构
time_t,该对象中存放的是距离 1970-01-01 00:00:00 +0000 (UTC) 所经过的秒数.
struct tm,该对象中存放的是具体的日期值,包括年,月,日,时,分,秒,等等.如下:
struct tm {
int tm_sec; /* 秒数,[0,60],取 60 的原因是可能存在润秒的缘故 */
int tm_min; /* 分钟,[0,59] */
int tm_hour;/* 小时,[0,23] */
int tm_mday;/* 日期数,[1,31] */
int tm_mon;/* 距离一月的月数,[0,11],即当为0时,表明是 1 月. */
int tm_year;/* 距离 1900 所经过的年数,即当前实际年份为 tm_year+1900 */
int tm_wday;/* 距离周日的天数,[0,6],即当为0时,表明是周日 */
int tm_yday;/* 距离 1 月 1 号的天数,[0,365] */
int tm_isdst;/* 是否是夏令时,若<0,表明该域信息不可用,若=0,表明没有采用夏令时,若>0,表明采用了夏令时 */
};
函数之间的关系
time(),从内核中取出当前时间,可以使用 gettimeofday() 获取更精确的时间.(参考 man 手册)
gmtime(),localtime(),将 time_t 类型的对象格式化为 struct tm 类型.(参考 man 手册)
mktime().将 struct tm 类型的对象格式化为 time_t 类型,该函数具体见下:
/**
* 将 struct tm 类型格式化为 time_t 类型.
* tm 作为输入/输出参数:
* 在输入时,将忽略 tm_wday,tm_yday 域,并且若 tm_isdst<0,此时 mktime() 内部自己判断是否使用了夏令时,若 tm_isdst >0,表明采用了夏令时,否则未采用夏令时.
* 在输出时,若 tm_sec,tm_min,...,tm_year 的值超出范围,则会规范化,如 10月40号会被规范为 11月9号;tm_wday,tm_yday 会重新计算.tm_isdst 会重新设置表明是否使用了夏令时.
* 若 tm 包括的信息无法转化为 time_t 类型,则 tm 各域的值保持不变,并且返回 -1.
*/
time_t mktime(struct tm *tm);