我想计算两次的差异并以漂亮的方式打印出来。我知道差异永远不会超过 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 datetime diff 页面获取:
$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
PHPdate()
函数用于格式化绝对时间戳(如“2012 年 7 月 20 日星期五 15:02 UTC”),而不是用于时差(如“3 小时 5 分钟前”)。
在某些情况下,可以date()
通过将您的时区设置为 UTC 并依靠 Unix 纪元恰好在 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 );
}
当然,如果您愿意,您可以扩展此功能,例如在输出中包含天数。
你永远不应该用它date
来计算时差。首先,它是丑陋的黑客。它不是为了那个目的。其次,它只有在时区设置为 UTC 时才能可靠地工作。
现在,为什么它不起作用:PHP 函数 date 有两个参数,format
并且timestamp
,后者被定义为从 1970 年 1 月 1 日 00:00 UTC 开始的秒数,称为 unix epoch。因此,如果您调用 date("H:i", 3600) 并且您的时区设置为 UTC,它将返回“01:00”,因为它表示 unix 纪元后一小时的时间,而纪元是在午夜。
问题是,unix 纪元仅在 UTC 的午夜出现,而不是在其他时区。这就是错误结果的根源。