mktime 的选择

来源:互联网 发布:html源码yuansms 编辑:程序博客网 时间:2024/05/17 19:23

    看了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算法解析

Linux内核中mktime()函数算法分析

个人认为《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.”

原创粉丝点击