PHP计算时差,结果1小时错误

时间:2012-07-20 14:55:32

标签: php date timezone

我想计算两次的差异并以漂亮的方式打印。我知道差异永远不会超过24小时,所以我尝试了以下

$time = 7200; //time difference in seconds
date("H:i:s", $time); // should print 02:00

结果出乎意料,它会打印03:00。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

为什么不是DateTime :: diff ??

在这里,查看PHP.net的DateTime

从php.net日期时间差异页面抓取:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

//Outputs +2 days

答案 1 :(得分:1)

您绝不应使用date来计算时差。首先,它是丑陋的黑客。它不是为了这个目的。其次,只有当时区设置为UTC时,它才能可靠地工作。

现在,为什么它不起作用: PHP函数日期有两个参数formattimestamp,后者定义为1970年1月1日00:00 UTC称为unix epoch的秒数。因此,如果您调用date(“H:i”,3600)并且您的时区设置为UTC,它将返回“01:00”,因为它表示在unix epoch之后一小时的时间且该纪元是在午夜。

问题是,unix epoch仅在UTC时间午夜,而不是在其他时区。这是错误结果的来源。

答案 2 :(得分:1)

PHP date()函数用于格式化绝对时间戳(如“2012年7月20日星期五,15:02 UTC”),而不是时差(如“3小时5分钟前”) )。

在某些情况下, 可能会通过将您的时区设置为UTC并依赖于Unix的事实来欺骗date()以产生看起来像格式正确的时差的内容时代恰好落在UTC的午夜。然而,即便如此,这只适用于不到24小时的正时差。

相反,正确的解决方案是使用专为格式化时差而设计的函数,或者自己编写一个函数。这是一个简单的功能:

function format_time_difference ( $delta ) {
    $sign = ( $delta < 0 ? "-" : "" );
    $delta = abs( $delta );
    return sprintf( "%s%02d:%02d:%02d", $sign, $delta / 3600,
                    ($delta / 60) % 60, $delta % 60 ); 
}

当然,您可以将此功能扩展到例如如果你愿意,可以在输出中包括天数。