首页 > 关于时间计算的思考

关于时间计算的思考

2012-09-19   hisenKing

今天同事发了段代码给我,问我为什么php时间相加,返回的结构不正确。代码如下

<?php
date_default_timezone_set('Asia/shanghai');
echo date('Y-m-d H:i:s',526921200),"<br>";
echo date('Y-m-d H:i:s',526921200 + 86400),"<br>";
echo date('Y-m-d H:i:s',526921200 + 90000);

大家想想结果会是什么?

再来看下《php实战》中日期和时间处理一章中的一段代码

$timestamp=mktime(23,30,0,3,24,2007);
echo strftime("%B,%e",$timestamp)."\n";
$timestamp += 24*60*60; // add 24 hours
echo strftime("%B,%e",$timestamp)."\n";

很遗憾,输出的结果如下所示。

March 24

March 26

原因在与夏令时。php的日期 和时间函数会自动处理夏令时。如果夏令时从3月25日开始,而你在前一个午夜之前的那个小时开始,就会在3月26日的午夜之后结束,因为根据时钟,3月25日只有23个小时。

之前在大牛的博客上见过类似这个神奇的问题,因为得以有思路回复。其实在处理时间上,如果需要非常精确的话一定要使用GMT标准时间。以上代码结果输出分别是1986-09-13 00:00:00;1986-09-13 23:00:00;1986-09-14 00:00:00
为什么会出现这个问题呢?大家看下这个网页
时间
其中这里说明了当时间为1986-09-13 23:59:59再继续往后走一秒,应该是1986-09-14 00:00:00。但是这个时间往后调整了1个小时,变为了1986-09-13 23:00:00。
那么如何解决这个问题呢?代码如下:

<?php
date_default_timezone_set('Asia/shanghai');
//方法一
$t = gmmktime(0,0,0,9,13,1986);
echo gmdate('Y-m-d H:i:s',$t);
echo gmdate('Y-m-d H:i:s',$t + 86400);

//方法二
$time = strtotime('1986-9-13 00:00:00');
$time_step = strtotime('+1 day',$time);
echo date('Y-m-d H:i:s',$time_step);

此类问题还有类似

<?php
$a1 = strtotime('1927-12-31 23:54:08');
$a2 = strtotime('1927-12-31 23:54:07');
echo $a1-$a2;//353

具体分析看酷壳上的你确信你了解时间吗?

好久没更新了,需要除除草