转载自:http://www.gracecode.com/archives/3036/
项目中碰到 PHP 和数据库之间,计算存在时间计算误差。大致的情况为根据段时间字符串,例如
2012-12-14 00:00:00 UTC
使用 MySQL 的 UNIX_TIMESTAMP 函数以及 PHP 的 strtotime 计算得出的时间戳,大概有半分钟(差不多有28秒)的误差。
同时,比较‘诡异’的是直接使用当前时间(MySQL 中 UNIX_TIMESTAMP 不带参数,同时 PHP 直接使用 time 函数),却不存在误差。
排除了 PHP 和 MySQL 之间因为时区设置造成的时间误差 -- 根据经验,如果是时区设置造成的时间误差,应该有几个小时不会那么少。
搜索解决问题期间扫了下这篇帖子 ,觉得应该是‘闰秒’ 这玩意造成的问题。搜索 PHP 闰秒相关的配置似乎没有相关的,不过在这里似乎找到了些答案 。
You also can experience this behavior if your system timezone
is with leap seconds. To avoid the problem in this case please
run query UPDATE mysql.time_zone SET Use_leap_seconds='N'
and restart the server. Please inform us if this helps.
按照上述的步骤执行,解决了问题。
回过头来,我在工作机(Windows)上测试,发现并不起作用。研究了下,原来闰秒也需要操作系统的支持 :
1、对于大多数新的 Linux 内核,在设计时它们都是支持闰
秒的,这一点在 REHL4/5 的 2.6.x 内核中得到肯定。
2、如果 Linux 系统没有配种某种时间同步机制(比如NTP),
那么和闰秒无关,唯一导致的结果只是系统时间会比 UTC
时间快一秒。
3、Window Time Service 不支持闰秒,包括服务器和客户端。
回过头来考虑项目中碰到的这种情况,直接使用时间戳存储时间点会更精确些。最后,提供下相关的测试脚本 ,看看你的环境是否也会有类似的问题。