转帖前的话:这个问题我没有遇到过,事实上,如果不是看到这篇博客,我根本不知道原来还有闰秒这个问题。先看看这篇文章吧。
项目中碰到 PHP 和数据库之间,计算存在时间计算误差。大致的情况为根据段时间字符串,例如:
XML/HTML代码
- 2012-12-14 00:00:00 UTC
使用 MySQL 的 UNIX_TIMESTAMP 函数以及 PHP 的 strtotime 计算得出的时间戳,大概有半分钟(差不多有28秒)的误差。
同时,比较‘诡异’的是直接使用当前时间(MySQL 中 UNIX_TIMESTAMP 不带参数,同时 PHP 直接使用 time 函数),却不存在误差(测试脚本)。
排除了 PHP 和 MySQL 之间因为时区设置造成的时间误差 -- 根据经验,如果是时区设置造成的时间误差,应该有几个小时不会那么少。
搜索解决问题期间扫了下这篇帖子,觉得应该是‘闰秒’这玩意造成的问题。搜索 PHP 闰秒相关的配置似乎没有相关的,不过在这里似乎找到了些答案。
XML/HTML代码
- 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)上测试,发现并不起作用。研究了下,原来闰秒也需要操作系统的支持:
XML/HTML代码
- 1、对于大多数新的 Linux 内核,在设计时它们都是支持闰秒的,这一点在 REHL4/5 的 2.6.x 内核中得到肯定。
- 2、如果 Linux 系统没有配种某种时间同步机制(比如NTP),那么和闰秒无关,唯一导致的结果只是系统时间会比 UTC时间快一秒。
- 3、Window Time Service 不支持闰秒,包括服务器和客户端。