2

我有一个棘手的问题,我已经在 Stackoverflow 上搜索了所有相关问题,但都没有解决我的难题,尽管我认为我在绕圈子,所以这是问题:

我有这个代码:

$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

4 回答 4

2

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

于 2010-03-22T15:18:11.410 回答
2

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

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

,其中存储的$val是 UTC 时间 1970 年 1 月 1 日 01:05 的时间戳。请参阅Wikipedia 关于 Unix Time 的文章

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

于 2010-03-22T15:18:33.670 回答
0

我这样做了:

date_default_timezone_set('Europe/Helsinki');

格林威治标准时间+02:00

结果是:

03:05 Europe/HelsinkiEET+0200

所以,它实际上是在纠正时区,现在我发现解释很简单(我顿悟了): date() 从“1970 年 1 月 1 日 GMT”开始计算秒数,所以我的时区实际上是 3900,示例是正确的“02: 05" 从那个日期...

自学+1 -_-'

于 2010-03-22T15:18:12.440 回答
0

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

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

于 2010-03-22T15:18:42.870 回答