2016-11-24 249 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;