Как конвертировать большое время из H: i: s в H: i без фатальной ошибки?

1

У меня есть 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 работает хорошо, но не может обрабатывать такие значения. Есть ли решение этой проблемы?

  • 0
    Попробуйте это: echo date('H:i', strtotime($work2MinutesStr)); после заявления if
  • 0
    Почему там 838 часов?
Показать ещё 5 комментариев
Теги:
datetime

2 ответа

1

Я думаю, проблема в том, что иногда у вас более 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 или другим типом времени, чтобы получить нужное время и правильно его обработать.

  • 0
    Нет проблем на стороне MySQL, также нет проблем с DateTime с форматом H:i:s этого значения. Мне не нужны секунды, потому что у меня уже есть часы.
  • 0
    Отличное обновление! Извините, я не знал об этом типе ограничения времени MySQL ...
Показать ещё 6 комментариев
0

Преобразуйте часы в дни, а затем удалите дневные часы?

$timeParts = explode(':', $work2MinutesStr);
$hours = $timeParts[0];

$days = floor($hours / 24);
$daysHours = $days * 24;

$timeParts[0] = $timeParts[0] - $daysHours;

echo $timeParts[0] . ':' . $timeParts[1];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню