2013-03-28 187 views
9

我試圖獲取兩個日期時間之間的差異並將其作爲日期時間返回。我發現使用差異的例子,但我似乎無法得到它的權利。PHP找到兩個日期時間之間的差異

$timein = date("Y-m-d H:i:s"); 
$timeout = date("Y-m-d 20:00:00"); 
$totaltime = $timein->diff($timeout); 

但是$ totaltime logs「0000-00-00 00:00:00」到我的數據庫。這是因爲我沒有格式化我的總時間變量?

+0

date()爲您提供了字符串。你不能用字符串計算差異。 – Misch

回答

35

我不知道你要找什麼樣的格式在您的差異,但在這裏是如何使用的DateTime

$datetime1 = new DateTime(); 
$datetime2 = new DateTime('2011-01-03 17:13:00'); 
$interval = $datetime1->diff($datetime2); 
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds'); 
echo $elapsed; 
+0

拋出錯誤「致命錯誤:調用未定義方法DateTime :: diff()」 – Staleyr

+0

您運行的是哪個版本的PHP? –

+0

5.4,在netbeans – Staleyr

1

您可以簡單地使用日期時間差異和格式計算差額做到這一點。

<?php 
$datetime1 = new DateTime('2009-10-11 12:12:00'); 
$datetime2 = new DateTime('2009-10-13 10:12:00'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%Y-%m-%d %H:%i:%s'); 
?> 

對於DATETIME格式的詳細信息,請參閱:here
可以在方式改變區間格式,你想要的。

Here是工作示例

P.S.這些功能( diff()format())與> = PHP 5.3.0工作僅

+1

鍵盤連接斷開 – pal4life

+0

Downvote。這不會以OP所要求的格式提供結果。 – mickmackusa

-1
<?php 
$val1 = '2014-04-10 11:34:09'; 
$val2 = '2015-04-10 10:56:15'; 
$result1 = (explode(' ', $val1)) ; 
$result2 = (explode(' ', $val2)) ; 
$date1= new DateTime($result1[0]); 
$date2=new DateTime($result2[0]); 
$diffdate=date_diff($date1,$date2); 
$difftime = strtotime($result1[1]) - strtotime($result2[1]); 
$dates=$diffdate->format("%R%a days"); 
echo $dates; 
echo $difftime; 
?> 
+0

儘管這段代碼可能解決這個問題,但代碼中的[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)確實有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – Rizier123

+0

代碼查找datetime –

+1

Downvote的區別。這個更近的答案並不比現在接受的答案好,並且在答案本身中沒有提供任何解釋。它沒有提供問題要求的結果。這是一個低合格的答案,需要進行編輯或刪除。 – mickmackusa

-1
<?php 
$value='20140203113405'; 
$val='20150203113410'; 

$val1=str_split($val,2); 
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3]; 
$timeval1=$val1[4].":".$val1[5].":".$val1[6]; 

$val2=str_split($value,2); 
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3]; 
$timeval2=$val2[4].":".$val2[5].":".$val2[6]; 

$date1=new DateTime($dateval1); 
$date2=new DateTime($dateval2); 
$diffdate=date_diff($date1,$date2); 
$dates=$diffdate->format("%a days"); 
$difftime = strtotime($timeval1) - strtotime($timeval2); 
echo $dates; 
echo $difftime."seconds"; 
?> 
+2

雖然此代碼片段可能會解決問題,但代碼中的[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)確實有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – Rizier123

+0

iam試圖以這種格式獲取日期時間的差異 –

+0

Downvote。這個更近的答案並不比現在接受的答案好,並且在答案本身中沒有提供任何解釋。它沒有提供問題要求的結果。這是一個低合格的答案,需要進行編輯或刪除。而不是用多個低質量答案亂丟頁面,只發佈一個答案(最好的答案)並刪除其餘答案。 – mickmackusa

0

約翰·孔德確實在他的方法,所有正確的過程,但不能滿足你的問題的最後一步是要將結果格式化爲您的規格。

此代碼(Demo)將顯示原始差異,試圖立即格式化原始差露出的麻煩,顯示我的製備步驟,最後呈現正確格式化的結果:

$datetime1 = new DateTime('2017-04-26 18:13:06'); 
$datetime2 = new DateTime('2011-01-17 17:13:00'); // change the millenium to see output difference 
$diff = $datetime1->diff($datetime2); 

// this will get you very close, but it will not pad the digits to conform with your expected format 
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n"; 

// Notice the impact when you change $datetime2's millenium from '1' to '2' 
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n"; // only H does it right 

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s'])); 

echo '$detail array: '; 
var_export($details); 
echo "\n"; 

array_map(function($v,$k) 
    use(&$r) 
    { 
     $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT)); 
     if($k=='y' || $k=='m'){$r.="-";} 
     elseif($k=='d'){$r.=" ";} 
     elseif($k=='h' || $k=='i'){$r.=":";} 
    },$details,array_keys($details) 
); 
echo "Valid format: ",$r; // now all components of datetime are properly padded 

輸出:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds 
Invalid format: 06-3-9 01:0:6 
$detail array: array (
    'y' => 6, 
    'm' => 3, 
    'd' => 9, 
    'h' => 1, 
    'i' => 0, 
    's' => 6, 
) 
Valid format: 0006-03-09 01:00:06 

現在解釋我的日期時間值的準備:

$details需要日e diff object並將其轉換爲數組。 array_flip(['y','m','d','h','i','s'])創建一個鍵數組,它將用於從(array)$diff使用array_intersect_key()刪除所有不相關的鍵。

然後,使用array_map()我的方法迭代的每個值和密鑰中$details,襯墊其左側與0的適當的長度,並連接所述$r(結果)字符串必要隔板與所請求日期時間格式相一致。