项目中碰到 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 --
//这段代码应该依次输出 本地时间戳 本地时间戳 GMT时间戳 GMT时间戳
echo time().' '.mktime().' '.gmmktime().' '.strtotime(gmdate('Y-m-j G:i:s'));
//结果在 VPS 上面看到的是 本地时间戳 本地时间戳 本地时间戳 GMT时间戳
//在本地的 PHPNOW 上面看到的是 本地时间戳 本地时间戳 本地时间戳 本地时间戳
//疯掉鸟,PHPNOW的设置的确是有问题的,不过VPS上面也太诡异了吧 (PД`q。)·。'
明大 我用了你的vimrc_20091214.zip
很好用 先谢谢了
但是之前的博文貌似不能评论,我有个问题想问你。。只好问到这里来了
就是 vim中html代码怎么设置自动缩进呢?
比如php文件当中夹杂的html代码,每次一换行就顶格……苦恼死我了……
请问这个有解决办法吗?多谢!
可以搜索相关的 HTML 或者 PHP 的缩进(indent)文件,不过由于两个语法混杂,我也没有找到比较满意的 :^(
[...]http://www.gracecode.com/archives/3036/[...]
明爷
是啊。我一值在加8和减8小时之间徘徊。
http://josephscott.org/archives/2010/10/why-mysql-timestamp-is-24-seconds-different-from-php/
上次看到这个,直接拿系统时间是个更好的方案。多机器的时候不用全改。