我想计算两个时间戳之间的差异,然后将它们转换回可读的人类日期,但是我的日期增加了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
答案 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将是明智的方法来处理此问题。