-
1.后台统计方法执行时间显示为秒级别
-
2.前台统计时间,显示为秒级别
不过从Firefox的firebug调试工具统计时间来看前台统计时间比真实时间短,
调试工具统计的时间跟后台统计的时間相近且稍长,合情理所以前台统计数据直接从后台取。
-
并在select语句后加:
经验内容仅供参考如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士
我们知道从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语句后加:
经验内容仅供参考如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士