Я написал следующий код, чтобы определить количество времени, которое сотрудники тратят на выполнение задачи:
$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 час, что является неправильным. Каков правильный путь?
после изменения 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');