выяснение разницы между двумя временами

Я написал следующий код, чтобы определить количество времени, которое сотрудники тратят на выполнение задачи:

$time1 = $row_TicketRS['OpenTime']; $time2= $row_TicketRS['CloseTime']; $t1=strtotime($time1); $t2=strtotime($time2); $end=strtotime(143000); //143000 is reference to 14:30 //$Hours =floor((($t2 - $t1)/60)/60); $Hours = floor((($end- $t1)/60)/60); echo $Hours.' Hours '; 

Вышеприведенный код не дает мне правильного времени.

Например, с временем начала 09:19:00 и временем окончания 11:01:00, это дает мне время продолжительности всего 1 час, что является неправильным. Каков правильный путь?

Solutions Collecting From Web of "выяснение разницы между двумя временами"

после изменения strtotime('14:30:00') все работает нормально .. см. ниже

 $time1 = '09:19:00'; $time2= '11:01:00'; echo "t1".$t1=strtotime($time1); echo "<br/>t2:".$t2=strtotime($time2); echo "<br/>end:".$end=strtotime('14:30:00'); echo "<br/>floor value:"; var_dump(floor((($end- $t1)/60)/60)); //$Hours =floor((($t2 - $t1)/60)/60); $Hours = floor((($end- $t1)/60)/60); echo $Hours.' Hours ' 

Ваше использование floor – это то, почему вы получаете только 1 час для этих входов. Эти входы приводят к 1,7 часам, если вы держите ответ в виде поплавка. floor автоматически округляется до нижнего целочисленного значения. Ознакомьтесь с http://php.net/manual/en/function.floor.php для получения дополнительной информации.

 $t1 = strtotime('09:19:00'); $t2 = strtotime('11:01:00'); $hours = ($t2 - $t1)/3600; //$hours = 1.7 

Если вы хотите более тонкую разницу во времени, вы можете использовать ее …

 echo floor($hours) . ':' . ( ($hours-floor($hours)) * 60 ); // Outputs "1:42" 

ОБНОВИТЬ:

Я только что отметил ваши комментарии по поводу ответа Long Ears. Проверьте мои комментарии выше, они верны. Ввод значений '09: 11: 00 'и '09: 33: 00' приводит к 0 часам (22 минуты).

Если вы введете эти значения и получите 4 часа, вы, вероятно, получите десятичную ошибку в своей математике. Используя '09: 11 'до '09: 33', результат составляет 0,367 часа. Если вы разделили результаты strtotime на 360, а не на 3600, вы получите результат 3,67 часа (или 4 часа, в зависимости от метода округления).

strtotime преобразует ваше время в значение int представляющее количество секунд с момента Unix. Поскольку вы конвертируете оба значения в секунды, а затем вычитаете значения друг от друга, результирующее значение равно количеству секунд. Есть 3600 секунд за 1 час.

 function getTimeDiff($dtime,$atime) { $nextDay=$dtime>$atime?1:0; $dep=explode(':',$dtime); $arr=explode(':',$atime); $diff=abs(mktime($dep[0],$dep[1],0,date('n'),date('j'),date('y'))-mktime($arr[0],$arr[1],0,date('n'),date('j')+$nextDay,date('y'))); //Hour $hours=floor($diff/(60*60)); //Minute $mins=floor(($diff-($hours*60*60))/(60)); //Second $secs=floor(($diff-(($hours*60*60)+($mins*60)))); if(strlen($hours)<2) { $hours="0".$hours; } if(strlen($mins)<2) { $mins="0".$mins; } if(strlen($secs)<2) { $secs="0".$secs; } return $hours.':'.$mins.':'.$secs; } echo getTimeDiff("23:30","01:30"); 

например, время начала – 09:19:00, а время окончания – 11:01:00, но это дает мне время продолжительности всего 1 час, что является неправильным

Вы вычисляете разницу в часах. что является правильным результатом для «времени начала – 09:19:00, а время окончания – 11:01:00»

Вам нужно strtotime('14:30') а не strtotime(143000)

Edit: Вообще-то, к моему удивлению, strtotime(143000) действительно имеет желаемый эффект, но только для двузначных часов, поэтому я все равно не буду полагаться на него. Во всяком случае, это не причина вашей проблемы;)

Вы можете использовать $hour = ($end - $t1)/(60*60)

В этом формате времени (секунд * минут * дней * месяцев * лет) => (60 * 60 * 2)

Лучше всего использовать http://php.net/manual/en/datetime.diff.php

 $start_t = new DateTime($start_time); $current_t = new DateTime($current_time); $difference = $start_t ->diff($current_t ); $return_time = $difference ->format('%H:%I:%S');