长丝部最后总结时间怎么计算时间时长算

    我们知道从CMOS中读出来的系统时間并不是time_t类型,而是类似于struct tm那样年月日时分秒是分开存储的。

    那么要把它转化为系统便于处理的time_t类型,就需要算法进行转换

    我们都知道我们的公历还是比较复杂的,有大月小月有闰年非闰年,处理起来会很麻烦

    但是Linux的源代码仅仅用了短短的几行就完成了这个复杂嘚转换(Gauss算法),实在令人惊奇话不多说,先看源代码:

    看上去令人眼花缭乱毫无头绪。下面就让我们对该算法作具体的分析

    先不看前面的,直接看return那句该式整体上具有这样的结构:

    这说明该算法是先算出从1970年1月1日开始的天数X,再进而求出具体的时间值T的

    Y很简单,它计算了从公元元年到所求年份为止所有的闰年数从W式看出,该算法先假设所有年都是正常年(365天)再加上闰年额外的天数(式Y)。

    到现在为止都算简单关键是Z式和X式中的那个常数719499是怎么计算时间时长回事,似乎莫名其妙还有就是它们和return语句前面的那个if判断有什麼关系呢?

    很明显它是想把1月和2月当作上一年年底的最后两个月,让3月作为一年的第一个月这样一来,我们可以尽量少的被闰年所影響

    再来看式Z,这个式子表面看不出任何名堂367这个数字显然很是奇怪。那让我们穷举一下mon看看这个式子算出的都是些什么值吧:

    似乎看出了什么?再让我们把相邻的两个mon的Z做一下减法看看:

    闻出点味道了吧很象大小月的规则。让我们回想起那个if语句作了什么它把1月2朤变成了11月和12月,3月变成了1月!还原一下看看:

    那好我们想想这个原理假设今天是1月1日,那你能说你今年已经过了31天了么显然不是,1朤还没过我们不能把它算进去。

    这里同然我们从4月看起,如果今天是愚人节那么距离3月1日我们经过了31天。

    就像前面说的我们假设┅年是从3月开始,到次年的2月结束按照这个规则,整个式子里有问题的只有3月理论上这里应该是0!

    但是这没关系,我们把它减去就行叻于是变成:

    回头看看W式,year * 365但是按照上面的理论,没过完的这一年不应该加进去所以这里把它减去,再和V式合并:

    我们记得这个算法的一年是从3月开始的因此少算了公元元年的1月和2月的天数:31 + 28 = 59天:(公元元年是正常年)

    那么最后的这个减1是什么?还是上面那个原理今天还没过,就不应该把它算进去!

    综上整个算法就明朗了,主要难于理解的是那个3月开始的假设以及367 * mon / 12会产生类似大小月的序列

    最後把这些式子整理并罗列一下,做为本文的结束:

  • 1.后台统计方法执行时间显示为秒级别

  • 2.前台统计时间,显示为秒级别

    不过从Firefox的firebug调试工具统计时间来看前台统计时间比真实时间短,

    调试工具统计的时间跟后台统计的时間相近且稍长,合情理所以前台统计数据直接从后台取。

  • 并在select语句后加:

经验内容仅供参考如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士

作者声明:本篇经验系本人依照真实经历原创,未经许可谢绝转载。

我要回帖

更多关于 怎么计算时间时长 的文章

 

随机推荐