php date不以正确的方式计算

时间:2013-03-16 22:19:43

标签: php date

我想计算两个时间戳之间的差异,然后将它们转换回可读的人类日期,但是我的日期增加了2个小时!我不知道为什么。

$data = $row['date_future']; // 1363473942
$time = time(); // 1363472242

//echoing future date
echo "Future time: ".date('H:i:s', $data)."<br/>";
echo "Current time:".date('H:i:s', $time)."<br/>";

输出:

  

未来时间:00:45:42

     

当前时间:00:17:22

没关系,但是当我想要计算差异时,我会额外花费2个小时!

echo "Difference: ".date('H:i:s', $data-$time);

输出:

  

差异:02:28:20

FIX:

$d1 = new DateTime(date('H:i:s', $data));
$d2 = new DateTime(date('H:i:s', $time));
$interval = date_diff($d2, $d1);

echo "Difference: ".($interval->format('%H:%i:%s'))

输出:

  

差异:00:28:20

2 个答案:

答案 0 :(得分:3)

时间戳是unix时间戳,它们代表自UTC时间1970年1月1日午夜以来经过的时间量(以秒为单位)。

两个时间戳之间的差异是1700秒,因此它代表1970年1月1日UTC午夜1700秒后的1700秒,即1970年1月1日0:28 UTC。您必须比UTC提前2小时,因此显示为1月1日,2:28。

答案 1 :(得分:3)

这不是真正的时区问题(至少没有在PHP配置中设置正确的时区参数) - 这是一个有缺陷的逻辑问题。

Unix时间戳以秒为单位,时间为1.1.1970,00:00:00 UTC。

1363473942 - 1363472242是1700 - 当你不仅看到那个日期的H:i:s时,它应该变得明显:

echo "Difference: ".date('r', $data-$time); // replaced format H:i:s with r

此输出

  

区别:周四,1970年1月1日01:28:20 +0100

- 所以我们在这里看一个完全不同的日期,并且在不同的时间点上开启/关闭时区偏移和DST,乍一看似乎不合逻辑实际上是可以预料。

从另一个时间戳中减去unix时间戳导致了几秒钟 - 但它不是一个unix时间戳,它将再次与原始时间戳有任何关系。

格式化这种差异,假设它是一个有意义的unix时间戳,因此必然会失败。

使用例如DateTime::diff将是明智的方法来处理此问题。