1

我想计算两个时间戳之间的差异,然后将它们转换回可读的人类日期,但是我的日期增加了 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

使固定:

$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

4

2 回答 2

3

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

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

于 2013-03-16T22:31:58.337 回答
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将是处理此问题的明智方法。

于 2013-03-16T22:36:42.960 回答