我想计算两次的差异并以漂亮的方式打印。我知道差异永远不会超过24小时,所以我尝试了以下
$time = 7200; //time difference in seconds
date("H:i:s", $time); // should print 02:00
结果出乎意料,它会打印03:00。
我做错了什么?
答案 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函数日期有两个参数format
和timestamp
,后者定义为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 );
}
当然,您可以将此功能扩展到例如如果你愿意,可以在输出中包括天数。