У меня есть запрос mysql, который получает среднее значение столбца (тип данных столбца – «время»). Значения столбца, например: 00:00:55, 00:00:59, 00:01:03
SELECT AVG(TIME_TO_SEC(column_name)) FROM table_name)AS average_result
В моем Php я отформатировал результат следующим образом:
<?php foreach($display_average as $da){ echo date("H:i:s", ($da["average_result"])); } ?>
Выходы: 08:00:59 вместо 00:00:59, Почему это начинается с 08? Или я что-то пропустил? Благодаря!
Функции даты и времени PHP и типы данных даты и времени MySQL обрабатывают временные метки времени на стене , а не длительности ; т.е. 00:00:55
означает пятьдесят пять секунд за полночь . Это не то, что вы хотите; вы не можете обрабатывать длительности более 23 часов 59 минут 59 секунд, так как типы данных и функции, которые вы используете, обрабатывают часы, которые не могут превышать эти значения.
Ваша конкретная проблема связана с настройками часового пояса. Ваша большая проблема заключается в том, что вам нужно хранить простые целочисленные значения, выражающие истекшие секунды или минуты; не временные метки. Чтобы отформатировать это в удобочитаемую строку в PHP, вы можете использовать класс DateInterval
.
см. php manul , о date_default_timezone_set
ваш часовой пояс +8
по умолчанию date.timezone
PHP – utc, u может изменить его на date.timezone = PRC
date_default_timezone_set('UTC'); echo date("H:i:s", 59);//00:00:59 //date_default_timezone_set('RPC'); //echo date("H:i:s", 59);//08:00:59
Всегда выбирайте стандартные / формальные подходы. Но если так или иначе вам это нужно, вы можете делать почти все с помощью программирования. Вот так
Получите свое время как количество (количество секунд в вашем времени, поданное) из базы данных, как
SELECT AVG ( HOUR(column_name) * 3600 + MINUTE(column_name) * 60 + SECOND(column_name) ) AS numeric_average_result FROM table_name
Теперь вы можете преобразовать количество секунд в нужное время, как
foreach($display_average as $da) { $r = numToTime($da["numeric_average_result"]); echo "<br>".$r; } function numToTime($num) { $seconds = $num%60; $num = (int)($num/60); $minutes = $num%60; $hours = (int)($num/60); return make2digit($hours).":".make2digit($minutes).":".make2digit($seconds); } function make2digit($val) { if(strlen($val) == 1) return "0".$val; else return $val; }