我想计算两次的差值,并以漂亮的方式打印出来。我知道差异永远不会超过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有两个参数,format
和timestamp
,后者定义为从1970年1月1日00:00UTC开始的秒数,称为unix epoch。因此,如果您调用date("H:i",3600),并且您的时区设置为UTC,它将返回"01:00",因为它表示unix epoch后一小时的时间,而epoch在午夜。
问题是,unix epoch只在UTC的午夜,而不在其他时区。这就是错误结果的来源。