2016-09-30 2 views
1

Я пытаюсь вычислить количество часов, в течение которых человек работал в данный день. Для этого мне нужно получить разницу между двумя объектами DateTime в часах, минутах и ​​секундах. До сих пор я могу успешно сделать так, как этотPHP: получить разницу между двумя объектами DateTime в часах, минутах и ​​секундах

 $timeIn  = new DateTime($time['timeIn']); 
     $timeOut  = new DateTime($time['timeOut']); 
     $time['hours'] = date_diff($timeIn, $timeOut) -> format("%H:%i:%s"); 

Это, кажется, работает хорошо, пока я не положил в тестовом случае, когда работник забыл часы из. Теперь, давайте скажем, что

$timeIn = '2016-09-28 14:26:17' 
$timeOut = '2016-09-30 09:53:53' 

В этом случае, разница должна быть 43:27:36 (Потому что в течение дня между timeIn и таймаута). Вместо этого я получаю 19:27:36 (как будто это просто усекает выходные и возвращает остальных). Как я могу добавить этот день на часы, а не усекать его? (Я ищу, чтобы получить 43:27:36, НЕ 1day, 19 часов, ect ect. Поэтому я пытаюсь получить ответ в HH: MM: SS)

+1

Вы должны делать расчеты вручную. Это объясняет, как это сделать в минутах, который не слишком далеко от того, что вы хотите http://stackoverflow.com/questions/16776061/get-php-dateinterval-in-total-minutes –

+1

Для более четкого объяснения вопроса так что вы получите лучшие ответы: Вы хотите только иметь «ЧЧ: ММ: СС», или вы в порядке с префиксом за несколько дней до начала? как в 'DD HH: MM: SS'? –

ответ

2

Как Скотт предложил, но с подстройкой, мы должны форматировать это сам, но у нас есть отличная sprintf помочь:

$start = new \DateTime("2016-09-28 14:26:17"); 
$end = new \DateTime("2016-09-30 09:53:53"); 

$interval = $end->diff($start); 

$time = sprintf(
    '%d:%02d:%02d', 
    ($interval->d * 24) + $interval->h, 
    $interval->i, 
    $interval->s 
); 
+0

Holy Sh * t на галерее, о которой я никогда бы не подумал. Оно прекрасно! Спасибо! –

+1

Добро пожаловать, его можно сделать в один лайнер, просто поделившись таким, чтобы его было легче читать. –

+0

Я предпочитаю читаемость по номерам строк;) Он идеален именно так, как есть. –

1

date_diff() возвращает экземпляр DateInterval. Посмотрите на DateInterval::format метод или DateInterval::days поле. Часовые, минутные и второстепенные значения относятся к остатку в последний день (если более одного). Вы ищете a общее количество дней.

$timeIn  = new DateTime($time['timeIn']); 
$timeOut  = new DateTime($time['timeOut']); 
$diff   = date_diff($timeIn, $timeOut) -> format("%H:%i:%s"); 
$days   = $diff->days; 
$time['hours'] = // calculate based on days + remainder... 
+0

это приятно и элегантно. Мне это нравится. Но как я могу умножить дни на 24, а затем добавить их в часы? Похоже, что это становится очень сложным ... –

4

Я предпочитаю использовать \DateTime объекты - хотя там не должно быть большой разницы в конце date_diff просто псевдоним \DateTime::diff.

Вы хотите проверить количество дней в объекте DateInterval;

$start = new \DateTime("2016-09-28 14:26:17"); 
$end = new \DateTime("2016-09-30 09:53:53"); 

$interval = $end->diff($start); 

$days = $interval->d; 
if ($days > 0) { 
    echo $interval->format("%a %h:%i:%s\n"); 
} else { 
    echo $interval->format("%h:%i:%s\n"); 
} 
+0

Это сработает, но это не то, что я задаю в исходном вопросе. (+1 в любом случае для справки) Мне нужно преобразовать это количество дней в часы (умножить на 24) и добавить его к числу часов, которое было возвращено date_diff(). Есть идеи? –

+0

Помните, что при использовании '[interval] -> format() символы, используемые для форматирования вывода, отличаются от обычного использования при форматировании регулярных дат. Например. если вам нужны ведущие нули, используйте '% H:% I:% S'. – matthias

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