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


PHP calculating time difference, result 1 hour wrong

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

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

结果出乎意料,而是打印03:00。

我做错了什么?

为什么不使用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

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

在某些情况下,可以通过将时区设置为UTC并依赖Unix epoch恰好落在UTC的午夜这一事实,诱使date()产生看起来格式正确的时差。然而,即便如此,这也只适用于小于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 ); 
}

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

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

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

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