为什么PHP date()在diff计算中增加+1小时?

时间:2010-03-22 14:56:45

标签: php datetime date strtotime

我有一个棘手的问题,我已经搜索了Stackoverflow上的每个相关问题并且都没有解决我的难题,虽然我认为我是在圈子里运行,所以这里有一个问题:< / p>

我有这段代码:

$val = (strtotime('2010-03-22 10:05:00')-strtotime('2010-03-22 09:00:00'))

这正确返回$ val = 3900(3600秒= 1小时,300秒= 5分钟)

但是这样做:

echo date("H:i",$val)."<br>";

返回02:05

即使这样做:

echo date("H:i",3900)."<br>";

返回02:05(只是为了天真地确定)

这样做:

echo date("H:i eTO",3900)."<br>";

返回

02:05 System/LocaltimeCET+0100

哪个是正确的,我的时区是CET并且是+1。

发生了什么事?由于某种原因,date()是否更正了时区?或者我做错了什么?

4 个答案:

答案 0 :(得分:2)

这是因为使用date(,)返回纪元(1970年1月1日00:00:00 UTC)+时间戳中的秒数。它会将自己本地化为您的时区,因此如果您为其提供的时间戳为0,则将返回1970年1月1日01:00:00 UTC + 1。

答案 1 :(得分:2)

是的,它正在纠正时区。当你这样做

$val = (strtotime('2010-03-22 10:05:00')-strtotime('2010-03-22 09:00:00'))

$val中存储的是UTC时间01:05,1970年1月1日的时间戳。请参阅Wikipedia's article on Unix Time

如果您正在处理两个时间戳之间的差异,我建议使用DateTime::diff(需要PHP 5.3)。

答案 2 :(得分:0)

我这样做了:

date_default_timezone_set('Europe/Helsinki');

GMT + 02:00

结果是:

03:05 Europe/HelsinkiEET+0200

所以,它实际上正在纠正时区,现在我发现解释非常简单(我有一个顿悟):date()计算秒数“1970年1月1日GMT”所以实际上是3900在我的时区和示例中,从那天起正确“02:05” ......

自我学习+1 -_-'

答案 3 :(得分:0)

这实际上是正确的行为,因为日期适用于当地时间,而您使用的是GMT +1。你给它一个时间戳(3900),即1/1/1970 1:05,它只是广告1来到你的时区。

如果这是您的预期用途,那么您只需减去机器的GMT偏移量即可获得正确的值。