2

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

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

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

我究竟做错了什么?

4

3 回答 3

2

为什么不是 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
于 2012-07-20T15:01:31.920 回答
1

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 ); 
}

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

于 2012-07-20T15:14:01.227 回答
1

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

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

问题是,unix 纪元仅在 UTC 的午夜出现,而不是在其他时区。这就是错误结果的根源。

于 2012-07-20T14:55:31.593 回答