2013-08-23 84 views
1

我想在php中的兩個日期時間之間的差異。我想在H:i:s格式中進行比較。這是我的代碼。是否有任何函數來查找日期和時間到日期時間在PHP中的區別?

$start_date = 2013-08-13; 
$end_date = 2013-08-23; 
$start_time = 12:28:58; 
$end_time = 13:16:45; 

$h1 = substr("$start_time",0,-6); 
$i1 = substr("$start_time",3,-3); 
$s1 = substr("$start_time",6); 
$h2 = substr("$end_time",0,-6); 
$i2 = substr("$end_time",3,-3); 
$s2 = substr("$end_time",6); 

$m1 = substr("$start_date",5,-3); 
$d1 = substr("$start_date",8); 
$y1 = substr("$start_date",0,-6); 
$m2 = substr("$end_date",5,-3); 
$d2 = substr("$end_date",8); 
$y2 = substr("$end_date",0,-6); 

$r1=date("Y-m-d H:i:s",mktime($h1,$i1,$s1,$m1,$d1,$y1)); 
$r2=date("Y-m-d H:i:s",mktime($h2,$i2,$s2,$m2,$d2,$y2)); 
+2

你試過['DateTime'](http://php.net/datetime)嗎? –

+0

y ...我試過但沒有工作。在日期時間我使用日期時間::差異,但我像這樣返回致命錯誤。 致命錯誤:調用未定義的函數date_diff()在c:\ wamp \ www \ website \ module \ 1 \ Save.php上第57行 –

+0

也許在你的php版本中沒有DateTime類。 –

回答

0

這是我用過的。它的工作。如果有任何建議,請告訴。謝謝大家的回覆。

function ensure2Digit($number) { 
    if($number < 10) 
    { 
     $number = '0'.$number; 
    } 
    return $number; 
    } 


$start_date = "2013-08-13"; 
$end_date = "2013-08-23"; 
$start_time = "12:28:58"; 
$end_time = "13:16:45"; 

$start_date = $start_date." ".$start_time; 
$end_date = $end_date." ".$end_time; 

$start_date = strtotime($start_date); 
$end_date = strtotime($end_date); 

$difference = $end_date - $start_date; 

$h = ensure2Digit(floor($difference/3600)); 
$m = ensure2Digit(floor(($difference/60) % 60)); 
$s = ensure2Digit($difference % 60); 
$time_taken = $h.":".$m.":".$s; 
-1

就颳起了這一點:

function sec_diff($date_ini, $date_end, $time_ini='00:00:00', $time_end='00:00:00') 
{ 
    $d_ini=explode('-', $date_ini); 
    $h_ini=explode(':', $time_ini); 
    $d_end=explode('-', $date_end); 
    $h_end=explode(':', $time_end); 

    $t_ini=mktime($h_ini[0], $h_ini[1], $h_ini[2], $d_ini[1], $d_ini[2], $d_ini[0]); 
    $t_end=mktime($h_end[0], $h_end[1], $h_end[2], $d_end[1], $d_end[2], $d_end[0]); 

    return $t_end-$t_ini; 
} 

這將讓你在幾秒鐘的差別。您可以輕鬆地對結果進行操作以獲得所需的格式:結果/ 3600會給你幾個小時。其餘的操作會給你空閒的秒數,你可以/ 60分鐘。任何休息都是幾秒鐘。

4

爲什麼在可以使用strtotime()時執行所有這些操作? 更簡單:如果您將日期與空格連接在一起,那麼您可以使用上述函數生成時間戳。 然後,只需簡單的計算即可獲得兩者之間的差異。

最後,您將格式化日期(「H:i:s」)的結果時間戳(在你的情況下)。

這是代碼。

$start_date = "2013-08-13"; 
$end_date = "2013-08-23"; 
$start_time = "12:28:58"; 
$end_time = "13:16:45"; 

$start_date = $start_date." ".$start_time; 
$end_date = $end_date." ".$end_time; 

$start_date = strtotime($start_date); 
$end_date = strtotime($end_date); 

$difference = $end_date - $start_date; 

echo date("H:i:s", $difference); 
+1

非常感謝您的幫助好友。 –

+1

我想說的一件事是,strtotime函數只返回兩個變量之間的時間差異,不包括日期甚至連接。如果他們的差距超過2天,那麼它也只能在24小時內返回時差。我希望H:m:s在兩天之間的總時間。你能幫忙嗎? –

+0

這是真的,我的壞。然後,您可以使用像這裏http://stackoverflow.com/a/3172665/1487536這樣的函數,將$ difference作爲參數傳遞。然後你會得到預期的結果。 發生這種情況的原因是,一天中有86400秒,如果您有更多,您可能會有意想不到的結果(如我之前發佈的鏈接的接受答案中所述)。 – Andy94

2

DateTime是這個職位的最佳工具: -

$start_date = '2013-08-13'; 
$end_date = '2013-08-23'; 
$start_time = '12:28:58'; 
$end_time = '13:16:45'; 

$start = new \DateTime($start_date . ' ' . $start_time); 
$end = new \DateTime($end_date . ' ' . $end_time); 

$diff = $start->diff($end, true); 

$diffDateInterval一個實例,所以你可以使用DateInterval::format()呼應了時間: -

echo $diff->format("%H:%I:%S"); 
相關問題