2014-12-22 83 views
0
// $p_hour_data['p_hour']=02:00:00 
// $data['dapr_p_hour']=01:00:00 
// answer is=01:00:00 

$total_hour=((strtotime($p_hour_data['p_hour']))-(strtotime($data['dapr_p_hour']))); 
echo $total_hour=gmdate("H:i:s", $total_hour); 

給定的代碼是減去時間$p_hour_data['p_hour']=02:00:00$data['dapr_p_hour']=01:00:00的價值。時間與減法操作正常工作,但除了不

它給出了結果右00:01:00

但是,當我將其更改爲添加它給出了錯誤的答案09:31:44

爲什麼會發生這樣的時間添加操作的任何解決方案?

+0

這與'mysql'有什麼關係? –

+0

如果與時間一起工作,總是嘗試使用時間戳,現在您處於您正在嘗試計算小時的情況下,此時間沒有與其關聯的日期。時間不是魔術師,它會處理任何你想傳遞給它的東西。 – Jeredepp

+0

,因爲數據來自mysql,我想要2次數據加入操作,將傳遞到MySQL數據庫。 – user3300358

回答

0

的問題是,你沒有指定時區:例如(使用php -a交互模式):

> echo gmdate("H:i:s",strtotime('01:00:00')); 
00:00:00 

不過,若你添加"UTC"到所有時間戳,正確的結果顯示出來。

原因是,如果您不指定時區,PHP將查看服務器設置並假定時間在服務器指定的時區中表示。這意味着02:00:00在比利時被解析爲01:00:00 UTC。對於減法,這不是一個問題(除非節省時間也是一個部分)。但是,如果需要增加,每天開始時需要有一個約定。但是,通過添加UTC,時間不那麼模糊。

(使用php -a):

$ php -a 
php > echo gmdate("H:i:s\n",strtotime('02:00:00 UTC')+strtotime('01:00:00 UTC')); 
03:00:00 
php > echo gmdate("H:i:s\n",strtotime('02:00:00 UTC')-strtotime('01:00:00 UTC')); 
01:00:00 
php > echo gmdate("H:i:s\n",strtotime('02:00:00')-strtotime('01:00:00')); 
01:00:00 
php > echo gmdate("H:i:s\n",strtotime('02:00:00')+strtotime('01:00:00')); 
01:00:00 
0

您的問題沒有提及一個時區問題作爲@CommuSoft。這是一個「整數」溢出值問題。

考慮到strtotime返回一個UNIX時間戳值(有點大的值,但仍然在您的系統的整數值範圍內),但向其中添加另一個時間戳值(另一個大的值)會導致PHP處理的整數溢出通過將結果轉換爲浮點數;見here

strtotime('02:00:00'); //int(1419213600) 

strtotime('01:00:00'); //int(1419210000) 

strtotime('02:00:00') + strtotime('01:00:00'); //float(2838423600) 

(int) (strtotime('02:00:00') + strtotime('01:00:00')); //int(-1456543696) 

//Values can vary due to different default time zone ;) 

一旦傳遞給date功能的結果,它會被轉換回integer => -145 .....(一些負值)和您的時間戳相當於1923-11-05 21:31:44

希望它能幫助你找出問題所在。