Попытка рассчитать время для отслеживания некоторых задач. Мне нужно учесть некоторые разрывы, которые я сначала проверяю с помощью некоторых операторов IF, а затем мне нужно вычесть все разрывы из общего времени, прежде чем выделять время для моей базы данных. Начальный и конечный том взят из HTML-формы с типом ввода «время» и разрывами, которые жестко закодированы в коде, как вы можете видеть ниже. Они считаются строками?
Я хочу, чтобы это произошло.
(«Время окончания» — «Время начала» — «Все перерывы» = «Общее время»). Но почему-то я не могу заставить эту работу ..
Вот мой код:
//Check for breaks
if ($time_start <= "10:00:00" and $time_finish >= "10:10:00"){
$halftime_morning = "00:10:00";
} else $halftime_morning = "";
if ($time_start <= "11:20:00" and $time_finish >= "11:50:00"){
$lunch = "00:30:00";
} else $lunch = "";
if ($time_start <= "15:00:00" and $time_finish >= "15:10:00"){
$halftime_afternoon = "00:10:00";
} else $halftime_afternoon = "";
if ($time_start <= "17:00:00" and $time_finish >= "17:30:00"){
$dinner = "00:30:00";
} else $dinner = "";
//Calculates the total working hours
$total_working_time = new DateTime($time_finish);
$total_working_time->diff(new DateTime($time_start));
echo "Working time :" . $total_working_time->format("H:i:s") . "\n";$halftime = new DateTime($halftime_morning);
$halftime->add(new DateInterval($halftime_afternoon));
//echo "Working time" . $halftime->format('H:i:s') . "\n";
$food = new DateTime($lunch);
$food->add(new DateInterval($dinner));
//echo "Food" . $food->format("H:i:s") . "\n";
$break = new DateTime($food);
$break->add(new DateInterval($halftime));
//echo "Break" .$break->format("H:i:s") . "\n";
$total_working_time = new DateTime($working_time);
$total_working_time->diff(new DateTime($break));
//$total_working_time = "";
Также пытался добавить новый DateTime () на перерывах, как это:
$dinner = new DateTime("00:30:00");
Другое решение, которое я пробовал:
$break = (strtotime($halftime_morning) + strtotime($lunch) + strtotime($halftime_afternoon) + strtotime($dinner));
echo date('H:i:s', $break );
Пример из Stack Overflow тоже пробовал
$origin = '00:00:00';
$newTotal = '00:45:00';
$oldTotal = '00:16:00';
$added = strtotime($newTotal) + (strtotime($oldTotal) - strtotime($origin));
echo date('H:i:s', $added )
Это одна из моих ошибок из первого фрагмента кода:
Working time :21:30:00 Catchable fatal error:
Object of class DateTime could not be converted to string in filename.php on line 72
Строка 72 — мой код для вставки данных в SQL. Я получил тонны или ошибки в своем коде, пытаясь манипулировать временем раньше.
Я действительно не понимаю, как это решить. Как я понимаю, часть моей проблемы в том, что я пытаюсь сопоставить строку со временем. Считаются ли данные из моей формы (тип ввода (время) строкой или временем? Имеет ли значение, если я использую «» или «00:00:00» для своих перерывов?
Какое-то время я получал «diff» для работы с DateTime, но никогда «add». В настоящее время он даже не вычитает время начала из времени окончания.
Какие-либо предложения?
Изменить: я думаю, что мне нужно уточнить. Мое время никогда не считается правильным. За мое общее время начальное время никогда не вычитается, и для остальных перерывов я получаю ошибки, указывающие мне смешивать строки и время.
Новый пример:
Следующий код каким-то образом выдает «2:20», когда я использую секунды вместо 1:20, что было бы правильно.
//Check for breaks
if ($time_start <= "10:00:00" and $time_finish >= "10:10:00"){
$halftime_morning = (10*60);//"00:10:00";
} else $halftime_morning = 0;
if ($time_start <= "11:20:00" and $time_finish >= "11:50:00"){
$lunch = (30*60);//""00:30:00";
} else $lunch = 0;
if ($time_start <= "15:00:00" and $time_finish >= "15:10:00"){
$halftime_afternoon = (10*60);//"00:10:00";
} else $halftime_afternoon = 0;
if ($time_start <= "17:00:00" and $time_finish >= "17:30:00"){
$dinner = (30*60);//"00:30:00";
} else $dinner = 0;
$break = 0;
$break = ($halftime_morning + $lunch + $halftime_afternoon + $dinner);
echo date('H:i:s', $break );
Вы можете попытаться преобразовать все ваши строки в метки времени. С ними легче работать.
Я попробовал это, и это должно быть вашим ожидаемым результатом.
$time_start = strtotime("10:00:00")%(60*60*24); //10:00 in seconds
$time_end = strtotime("17:30:00")%(60*60*24); //17:30 in seconds
$halftime_morning = 10*60; // 10 minutes - 600 seconds
$lunch = 30*60; //30 minutes - 1800 seconds
$halftime_afternoon = 10*60; //10 minutes - 600 seconds
$dinner = 30*60; //30 minutes - 1800 seconds
$totalBreak = $halftime_morning + $lunch + $halftime_afternoon + $dinner;
echo gmdate('H:i:s', $totalBreak );
Когда вы проверяете, что время находится между определенным временем обеда / обеда и т. Д., Вам также придется преобразовать эти значения в метки времени.
Других решений пока нет …