2013-04-09 53 views
0

我正在創建一個帶有條目的表格,其中包含簽入,簽出和說明。 checkin和checkout都是日期時間字段。計算總小時數,最佳解決方案?

我想計算一個項目的總工作時間。 這是我1個結賬和簽入之間計算:

{? $checkin = new DateTime($hour->checkin) ?} 
{? $checkout = new DateTime($hour->checkout) ?} 
@if($hour->checkout == '0000-00-00 00:00:00') 
    {? $checkout = new DateTime() ?} 
@endif 
{? $diff = $checkout->diff($checkin) ?} 
{? $hours = $diff->format('%H:%I') ?} 

現在,我通過這個計算秒總量:

$totaltime += strtotime("January 1, 1970 " . $hours . ":00") 

所有的一切都已經顯示在此之後,我計算量的小時本:

public static function format_time($seconds,$separator=':', $format = "%02d%s%02d") // t = seconds, f = separator 
    { 
     return sprintf($format, floor($seconds/3600), $separator, ($seconds/60)%60, $separator, $seconds%60); 
    } 

然而,當我這樣做: -

strtotime("January 1, 1970 00:40:00") 

我得到一個負詮釋。我究竟做錯了什麼?

+0

當你真正感興趣的是時間差異時,使用unix時間戳是一個非常糟糕的主意。以分鐘爲單位計算個體差異,將這些分鐘加起來,並將它們格式化爲hh:mm。 (同樣,不要使用基於unis時間戳的日期函數,而要使用簡單的數學運算。) – CBroe 2013-04-09 15:12:21

+0

此外,請確保您以UTC(或GMT)獲取這些時間。例如用'gmdate()'函數。否則,您可能會在夏時制轉換過程中得到錯誤或奇怪的結果。 – 2013-04-09 15:39:57

+0

@MattJohnson我的時區設置爲歐洲/阿姆斯特丹,是否會影響它? – Thijmen 2013-04-09 16:58:59

回答

1
<?php 
$checkin[0] = "2013-03-09 10:00:01"; 
$checkout[0] = "2013-03-12 10:55:15"; 

$checkin[1] = "2013-03-15 10:00:01"; 
$checkout[1] = "2013-03-15 10:55:15"; 

$checkin[2] = "2013-04-09 10:00:01"; 
$checkout[2] = "2013-04-15 10:55:15"; 

$diffSeconds = 0; 
for($i = 0; $i < count($checkin)-1; $i++){ 
    $diffSeconds += strtotime($checkout[$i]) - strtotime($checkin[$i]); 
} 
$hours = floor($diffSeconds/3600); 
echo $hours.' hours'; 
?> 
+0

這是關於整個工作時間,所以更多的條目。所有小時和分鐘的總和。 – Thijmen 2013-04-09 15:19:27

+0

我編輯了答案並添加了一個循環。 – alexP 2013-04-09 16:10:07