2016-11-24 257 views
-2

我正在使用此代码来计算时间段。事实上,我想要两个HH:MM:SS时刻之间的时间段,并且结果为HH:MM:SS格式。hh:mm:ss返回错误的答案在php

$time1 = strtotime('00:00:00'); 
$time2 = strtotime('00:00:07'); 
$diff = $time2 - $time1; 
$diff = date('H:i:s', $diff); 

我期待00:00:07但我得到01:00:07。可能是什么问题呢?

Irvin运行here,并得到正确的答案,但我在我的本地机器上运行相同的代码,错了! 它是时区还是一些配置会影响结果?

+0

一切工作正常与我的演示。与您的代码完全相同。结果是'00:00:07'。 https://eval.in/684340 – Irvin

+0

@伊文,我在本地机器上运行,它给了我01:00:07,它疯了!但也许它取决于时区!! ?? –

+0

是的,它可能是。 – Irvin

回答

0

请停止使用strtotimedate函数。使用DateTime类。

如果你会更好地搜索,找到两个日期的差异已经全部结束了。例如,我的回答是here。稍微改变了它会是什么样子:

$create_time = "00:00:00"; 
$current_time="00:00:07"; 

$dtCurrent = DateTime::createFromFormat('H:i:s', $current_time); 
$dtCreate = DateTime::createFromFormat('H:i:s', $create_time); 
$diff = $dtCurrent->diff($dtCreate); 

echo $diff->format("%H:%I:%S"); // to get HH:MM:SS format 

这将返回00:00:07 更多格式详见DateInterval::format

+0

@Nordenheim @Nordenheim,我会接受解决它的答案,你的答案是好的,但有时候时间不正确,它会阻止我的代码,我不希望它发生,在我之前的方法中,即使它们不是正确的格式,如HH:MM:SS,它不会给我内部错误。你知道如何在无法创建对象的情况下忽略对象错误! –

+0

@FarzadSalimiJazi有很多可能的答案,以'error_reporting'设置开始,并以您可能拥有的糟糕设计和实施的体系结束。这完全取决于您的代码,可能需要进行重大的重构。为了得到关于后者的建议,有[代码评论](http://codereview.stackexchange.com/) –

+0

Everyone:我刚刚清理了很多杂乱的评论。这些意见不适合长时间讨论。请不要用它们来开始或结束战争,讨论OOP是否很棒,实验失败,或者其他什么。谢谢。 –

0

这是因为当你从时间2减去时间1你最终得到7;

日期函数需要时间戳,7不是时间戳。你可以用http://php.net/manual/en/datetime.diff.php来计算差值吗?

+0

但我想,应该给我7点00:00:07! –

0

您应该考虑取消ini设置中的时区差异的UNIX纪元,本质上。这是1月1日'70。您可以通过添加e, O or P来检查您的服务器/应用程序的时区设置。检查this code

$time1 = strtotime('00:00:00 +0000'); 
$time2 = strtotime('00:00:07 +0000'); 
$epoch = strtotime('01 Jan 1970'); 
$diff = $time2 - $time1; 
var_dump($time1,$time2,$epoch,$diff); 
$diff = date('H:i:s', $epoch+$diff); 
echo $diff;