2013-04-09 4 views
0

Я делаю таблицу с записями, в которой содержится чек, выписка и описание. Оба checkin и checkout являются полями datetime.Рассчитать общее количество часов, лучшее решение?

Я хочу рассчитать общее количество времени, затраченного на проект. Это мой расчет между 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") 

Я получаю отрицательный int. Что я делаю не так?

+0

Работа с временными отметками unix, когда все, что вас интересует, это разницы во времени, это очень плохая идея. Рассчитайте индивидуальную разницу в минутах, суммируйте эти минуты и отформатируйте их как hh: mm later. (Опять же, не используя функции даты, основанные на временной отметке unis, но простая математика.) – CBroe

+0

Также убедитесь, что вы получили это время в UTC (или GMT). Например, с помощью функции 'gmdate()'. В противном случае вы можете получить неправильные или странные результаты при переходах перехода на летнее время. –

+0

@MattJohnson Мой часовой пояс настроен на Европу/Амстердам, это влияет на него? – Thijmen

ответ

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

+0

Я отредактировал ответ на добавленный цикл. – alexP

Смежные вопросы