代码之家  ›  专栏  ›  技术社区  ›  OverLex

为什么php date()在diff计算中添加了+1小时?

  •  2
  • OverLex  · 技术社区  · 16 年前

    我有一个棘手的问题,我已经在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 回复  |  直到 16 年前
        1
  •  2
  •   Sean    16 年前

    之所以发生这种情况,是因为使用date(,)返回epoch(1970年1月1日00:00:00 UTC)+时间戳中的秒数。它将自身定位到您的时区,因此如果您为它提供了时间戳0,它将返回1970年1月1日01:00:00 UTC+1。

        2
  •  2
  •   nemetroid    16 年前

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

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

    ,存储在 $val 是UTC 1970年1月1日01:05的时间戳。见 Wikipedia's article on Unix Time .

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

        3
  •  0
  •   OverLex    16 年前

    我这样做了:

    date_default_timezone_set('Europe/Helsinki');
    

    现在是GMT+02:00

    结果是:

    03:05 Europe/HelsinkiEET+0200
    

    所以,它实际上是对时区的修正,我发现现在的解释非常简单(我有一个顿悟):date()从 “1970年1月1日格林尼治标准时间” 所以实际上在我的时区3900和例子是正确的 “0:05” 从那天起…

    自学+1-”

        4
  •  0
  •   Daniel Dinu    16 年前

    这实际上是正确的行为,因为date与本地时间协同工作,并且您使用的是gmt+1。你给它一个时间戳(3900),它是1970年1月1日1:05,它只是广告1把它带到你的时区。

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