У меня есть mysql column workTime2
со значением 838:59:59
. Я получаю значение из базы данных и использую с этим кодом:
$work2MinutesStr = $employeeWork->workTime2;
if (strlen($work2MinutesStr) == 0) {
$work2MinutesStr = '00:00:00';
}
$work2Minutes = DateTime::createFromFormat('H:i:s', $work2MinutesStr);
$work2MinutesStr = $work2Minutes->format('H:i');
Но код не работает в последней строке с ошибкой: Fatal error: Call to a member function format() on a non-object
Тип DateTime работает хорошо, но не может обрабатывать такие значения. Есть ли решение этой проблемы?
Я думаю, проблема в том, что иногда у вас более 838 часов, и она выходит за пределы времени mysql. Нет формата, который обрабатывал бы трехзначный час в php, поэтому вы получите ошибку.
1) Я думаю, вам нужно преобразовать свое время в секундах в свой sql-запрос и работать с секундами.
2) Затем вы можете разделить секунды на 3600 и получить общее количество часов.
ОБНОВЛЕНО
По умолчанию значения, которые лежат вне диапазона TIME, но в противном случае действительны, привязываются к ближайшей конечной точке диапазона. Например, '-850: 00: 00' и '850: 00: 00' преобразуются в '-838: 59: 59' и '838: 59: 59'.
Поэтому, когда вы получаете 838:59:59
часов, это означает, что вы получаете неправильные часы. Может быть, у вас более 900 часов, но вы получаете только 839
из-за ограничения значения времени в MySQL. Но скажем, что число (839
) верно. Когда вы читаете это значение в php и пытаетесь использовать класс DateTime в php ИСПОЛЬЗОВАНИЕ h:i:s
, класс DateTime НЕ МОЖЕТ обработать корректно эту строку (838:59:59
) из-за формата времени INCORRECT. И формат неверен bacause имеет трехзначное число в часах. Поэтому, когда вы пытаетесь вызвать этот метод $work2Minutes->format('H:i');
он будет говорить, что Call to a member function format() on a non-object
потому что DateTime не может преобразовать строку в объект.
Таким образом, вам нужно работать с SECONDS или другим типом времени, чтобы получить нужное время и правильно его обработать.
H:i:s
этого значения. Мне не нужны секунды, потому что у меня уже есть часы.
Преобразуйте часы в дни, а затем удалите дневные часы?
$timeParts = explode(':', $work2MinutesStr);
$hours = $timeParts[0];
$days = floor($hours / 24);
$daysHours = $days * 24;
$timeParts[0] = $timeParts[0] - $daysHours;
echo $timeParts[0] . ':' . $timeParts[1];
echo date('H:i', strtotime($work2MinutesStr));
после заявления if