ACE_Time_Value保存了两个时间属性:秒和毫秒,各自用一个32bit有符号整数来存储。ACE_Time_Value本身可以用来表达相对时间和绝对时间,用于相对时间时它表示两个绝对时间之间的差值(秒的差值和毫秒的差值,注意这两个属性是独立的),由于32bit整数最大值的限制,它们各自有自己的差值上限,大约是正负68年(用秒属性时),正负25天(用毫秒属性时)的样子。当用于表示绝对时间时,它表示从1970年1月1日到当前时间的历时秒数,其秒值最大只能表示68年,也就是到2038年(1月19日03:14:07,星期二(UTC)),这就是同样著名的2038年时间跳转问题(和著名的千年虫问题相比)。
知道了这些限制之后,当我们使用ACE_Time_Value的sec(),msec()两个方法来获取时间差时,要特别注意它们的时间跃迁问题。由于所有的绝对时间都可以对应到某个ACE_Time_Value值,所以当你需要测试这个时间跳跃问题对你应用的影响时,可以手工将系统时间设为某个特定时间,然后运行你的应用,看看时间跳转时对你的应用有没有影响。
我简单试了一下,找了两个时间会发生跳跃的点(主要是毫秒跳跃;秒跳跃的可能性不大,除非你的应用经常要进行超过68年以上的时间差值计算!),可以用来做毫秒时间跳跃的测试场景。
1 当使用long来存储msec()的值时
2013年6月1日 21:49, msec()的值从负值跨过0到正值
2013年6月26日 18:20, msec()的值从正的最大值0x7F FF FF FF跳到负的最大值
2 当使用unsigned long来存储msec()的值时
2013年6月1日 21:49, msec()的值从最大值(0xFF FF FF FF)跳变到0
2013年6月26日 18:20, msec()的值(跨过0x7F FF FF FF)继续增加