在后台server 的开发中,经常需要基于日期、时间的比较、计算。类似的功能需求可能有:判断今天是星期几,判断两个时间是否在同一天,是否在同一周,判断当前时间是否在每日的特定时段内等等。虽然有系统函数localtime()可以很好的获取日期相关的详细信息,但由于其获取的信息足够详细,以至于在某些特定的简单功能上,使用localtime()实际上是有多余的开销。对于一些简单的判断,我们推荐采用更简单、更原始、更易于理解的方式来实现。
在Unix/Linux下,系统时间以time_t类型表示,本质上是一个整形数值,数值含义为从历史上的一个基准点开始(格林威治时间1970年1月1日零点),至当前时刻持续的秒数。在Linux下,time_t被定义long类型,即有符号整型。
考虑到中国与格林威治的时区不同,对中国来说,时间的基准起始点是1970年1月1日早八点整。对于任意时区,time_t的表示规则可以由下图表示。
如上,T0 = 0,表示起始时间;T1为即T0以后,第一天的零点时间;T2则表示第二天的零点时间;可以看出,对于不同时区,表示规律上的区别只是T1取值不同。从 T1时刻开始,T1,T2,T3...,Tn是一个等差序列,公差为一天的时间秒数,记为D = 86400(60*60*24)。
对于任意一个时间,可以表示成:
t = T1 + k × D + m …. 公式1
其中T1是一个时区相关的常量,m为本天之内的秒数,k可以理解为历史上的天数
经过变形可得出 k =(t - T1 - m) / D
由于m < D 可进一步简化:
k = (t - T1) / D …. 公式2
k为t时刻所在当天,自T0开始的天数。
对于时刻t,其所在当天零点的时间:
tz = T1 +(t - T1) / D × D …. 公式3
tz为 t时刻所在当天零点时间。
基于公式2我们可以判断任意两个时刻t1,t2是否是同一天,基于公式3我们可以求出时刻t1在所在当天所处的时段。基于这两个公式我们还可以扩展更多的相关于天的日期计算,而很容易看出,公式所使用的计算仅仅为整数数值运算而已。
对于星期的计算,我们可以仿造上面的思路。所不同的只有T1的取值为第一个星期的起始时间,如周一的早上零点时刻;D的取值为一周的秒数604800(86400*7)。
通过任意时刻t,我们可以求出其所在当前的零点时间,可以求出所在星期的开始时间,再通过简单的比较,也很容易实现计算出当天星期几等一些相关的扩展,在此不再一一赘述。
2015职称计算机考试书PowerPoint2007中 .. 定价:¥45 优惠价:¥42 更多书籍 | |
2015年全国职称计算机考试教材(2007模 .. 定价:¥225 优惠价:¥213 更多书籍 |