2013-02-26 3 views
0

Я понял, что это будет очень простая проблема, но я нигде не нашел решения.Добавление часов в PHP

Я создаю программу планирования в PHP и mySQL. Сдвиги имеют startTime и endTime, каждый из которых хранится как TIME в mySQL.

Я хочу, чтобы сложить общее количество часов для работника в течение недели, так что я пробовал:

$shifts = [...] //shifts for the week 
$totalTime = 0; //I've also tried "0:0:0" and strtotime("0:00:00"); 

for($d = 0; $d < 7; $d++){ 
    $start = strtotime($shift_types[$shifts[$d]]['ShiftType']['start_time']); 
    $end = strtotime($shift_types[$shifts[$d]]['ShiftType']['end_time']); 
    echo date("g:ia", $start) . '/' . date("g:i a", $end); 
    $totalTime += ($end-$start); 
    } 
} 

Проблема с этим, что $ totalTime не выходит на любое разумное число. Я думаю, это связано с тем, что PHP обрабатывает $ totalTime как временную метку с 1970 года, что приведет к чему-то совершенно другому. Все, что я действительно хочу, это стоимость нетто-часов, для этого не нужно иметь никаких связанных с ним значений даты-и-и-и-и-й.

Я должен упомянуть, что я отображая общее время с

echo date("g:i", $totalTime); 

При запуске с началом 9:30:00 и концом 16:15:00, она показывает «1 : 45" . Когда общее время не коснулось (потому что нет сдвигов), он отображает «7:00».

+1

, что он придумывает и какие значения вы испытываете с началом/завершением? Результат кода должен быть в секундах, поэтому вам может потребоваться разделить на 3600 (количество секунд в час), чтобы получить часы. –

+1

Возможно, вы захотите изучить [TIMEDIFF] (http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff) – Mike

+0

@JonathanKuhn Я добавил данные к после. Однако это не похоже на вопрос о разделении. –

ответ

0

strtotime возвращает временную метку Unix, количество секунд с момента, представленного этим временем. Таким образом, работа с секундами (и начиная с $totalTime в ноль) является правильным подходом. Если вы хотите количество часов, вам необходимо: $totalTime = $totalTime/(60 * 60); после вашей петли (разделить на 3600 секунд/час).

+0

Это теоретически имеет смысл, но почему же он показывает часы, даже если $ totalTime все равно равен 0? –

+0

Вы уверены, что '$ totalTime' - это то, что вы думаете? Распечатайте это прямо перед тем, как сделать вызов «date» после цикла. – Madbreaks

+0

Вы правы, я не знаю, что я думал, пытаясь отформатировать $ totalTime, используя дату. Изменение его для эха $ totalTime/(60 * 60) работало красиво. –

0

Я думаю, что это делает то, что вы хотите сделать:

$t1 = strtotime("2013-01-01 00:00:00"); 
$t2 = strtotime("2013-01-15 00:00:00"); 

echo round(($t2-$t1)/3600) ." hours". PHP_EOL; 

Или вы можете посмотреть использовать два DateTime объекты и метод diff(), как описано в моем блоге http://webmonkeyuk.wordpress.com/2011/05/04/working-with-date-and-time-in-php/

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