看了kernel_mktime的实现,linux/kernel/mktime.c
看了mktime的实现,include/linux/time.h
还是觉得include/linux/time.h的实现比较优雅,先上代码。
static inline unsigned long mktime (unsigned int year, unsigned int mon,
unsigned int day, unsigned int hour,
unsigned int min, unsigned int sec)
{
if (0 >= (int) (mon -= 2)) { /* 1..12 -> 11,12,1..10 */
mon += 12; /* Puts Feb last since it has leap day */
year -= 1;
}
return (((
(unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
year*365 - 719499
)*24 + hour /* now have hours */
)*60 + min /* now have minutes */
)*60 + sec; /* finally seconds */
}
对于上面这段代码算法的解释,我也查阅了几篇博文,供大家研究。
个人认为《Linux内核中mktime()函数算法分析》这边文章,分析的比较好。如为何从3月开始?以及这样带来的闰年计算的便利等等。另外主时间基准点问题说的也很明白。
下面也给出kernel_mktime的一个连接,请参考
kernel_mktime的实现,linux/kernel/mktime.c
其实关于mktime的实现,还有其他实现,只要你在编译开发环境里挖掘,肯定能找到对应实现,如php也有mktime的实现等等。
实际上我们要首先清楚一点:mktime是根据参数年月日时分秒,算出此参数时间到1970.01.01.00:00:00 所经历的总秒数。
时分秒的计算比较固定,(时*60+分)*60
日的计算,(日参数-1)*24*60*60
月的计算,g(月),根据参数月算出一年之中到这个参数月经历的天数
年的计算 f(年),根据参数年算出参数年到1970经过的天数
最后结果 (f(年)+g(月) )*24*60*60 + (日参数-1)*24*60*60 + (时*60+分)*60+秒
码海拾贝 date&time 关于time的接口到此为止,我估计在任何环境下研发使用都可以应急使用了。后面如果还增加相关文章,可能就是历法方面的。
Linus said:“I also hate Gregorius, pope or no. I'm grumpy.”