项目中碰到 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 不支持闰秒,包括服务器和客户端。

回过头来考虑项目中碰到的这种情况,直接使用时间戳存储时间点会更精确些。最后, 提供下相关的测试脚本 ,看看你的环境是否也会有类似的问题。

-- EOF --