Ответ 1
$hours = floor($seconds / 3600);
$mins = floor($seconds / 60 % 60);
$secs = floor($seconds % 60);
Если вы хотите получить формат времени:
$timeFormat = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
По какой-то причине я конвертирую формат времени, например: 03:30 to seconds 3*3600 + 30*60, now
. Я хочу преобразовать его обратно в свой первый (такой же) формат там. Как это могло быть?
Моя попытка:
3*3600 + 30*60 = 12600
12600 / 60 = 210 / 60 = 3.5, floor(3.5) = 3 = hour
Теперь, как насчет минут?
Учитывая, что значение может быть как 19:00 or 02:51.
Я думаю, вы получили картину.
И, кстати, как конвертировать 2:0 for example to 02:00 using RegEx?
$hours = floor($seconds / 3600);
$mins = floor($seconds / 60 % 60);
$secs = floor($seconds % 60);
Если вы хотите получить формат времени:
$timeFormat = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
Это может быть проще
gmdate("H:i:s", $seconds)
Если вам известно, что время будет меньше часа, вы можете просто использовать функции date()
или $date->format()
.
$minsandsecs = date('i:s',$numberofsecs);
Это работает, потому что системная эпоха начинается в полночь (1 января 1970 года, но это не важно для вас).
Если это час или больше, но меньше одного дня, вы можете вывести его в часах: mins: secs format с `
$hoursminsandsecs = date('H:i:s',$numberofsecs);
Более чем на один день вам понадобится использовать модуль для вычисления количества дней, так как это станет актуальной датой начала эпохи.
Надеюсь, что это поможет.
Возможно, самый простой способ:
gmdate('H:i:s', $your_time_in_seconds);
Пусть $time
будет временем в виде количества секунд.
$seconds = $time % 60;
$time = ($time - $seconds) / 60;
$minutes = $time % 60;
$hours = ($time - $minutes) / 60;
Теперь часы, минуты и секунды находятся в $hours
, $minutes
и $seconds
соответственно.
Другое решение, которое даст вам дни, часы, минуты и секунды для значения прошедших секунд:
function seconds_to_time($secs)
{
$dt = new DateTime('@' . $secs, new DateTimeZone('UTC'));
return array('days' => $dt->format('z'),
'hours' => $dt->format('G'),
'minutes' => $dt->format('i'),
'seconds' => $dt->format('s'));
}
print_r(seconds_to_time($seconds_value);
Дополнительная логика понадобится для "дней", если ожидается, что время будет более одного года. Используйте str_pad() или ltrim() для добавления/удаления ведущие нули.
Ответ ITroubs не затрагивает оставшиеся секунды, когда вы хотите использовать этот код для преобразования количества секунд в формат времени, например часы: минуты: секунды
Вот что я сделал, чтобы справиться с этим: (Это также добавляет начало от нуля до одной цифры минут и секунд)
$seconds = 3921; //example
$hours = floor($seconds / 3600);
$mins = floor(($seconds - $hours*3600) / 60);
$s = $seconds - ($hours*3600 + $mins*60);
$mins = ($mins<10?"0".$mins:"".$mins);
$s = ($s<10?"0".$s:"".$s);
$time = ($hours>0?$hours.":":"").$mins.":".$s;
$time будет содержать "1:05:21" в этом примере.
Если вы должны были жестко запрограммировать его, вы должны использовать модуль для извлечения времени, как предложили другие.
Если вы возвращаете секунды из базы данных MySQL, считая, что вам не нужны данные в формате секунд в вашем приложении, есть более чистый способ сделать это, вы можете использовать MySQL SEC_TO_TIME, и он вернет время в формате hh: mm: ss.
Eg.
SELECT SEC_TO_TIME(my_seconds_field) AS my_timestring;
что-то вроде этого?
if(is_numeric($time)){
$value = array(
"years" => 0, "days" => 0, "hours" => 0,
"minutes" => 0, "seconds" => 0,
);
if($time >= 31556926){
$value["years"] = floor($time/31556926);
$time = ($time%31556926);
}
if($time >= 86400){
$value["days"] = floor($time/86400);
$time = ($time%86400);
}
if($time >= 3600){
$value["hours"] = floor($time/3600);
$time = ($time%3600);
}
if($time >= 60){
$value["minutes"] = floor($time/60);
$time = ($time%60);
}
$value["seconds"] = floor($time);
return (array) $value;
} еще { return (bool) FALSE; }
схвачен от: http://www.ckorp.net/sec2time.php
Извините, что это слишком поздно, но, возможно, полезно
function mediaTimeDeFormater($seconds)
{
if (!is_numeric($seconds))
throw new Exception("Invalid Parameter Type!");
$ret = "";
$hours = (string )floor($seconds / 3600);
$secs = (string )$seconds % 60;
$mins = (string )floor(($seconds - ($hours * 3600)) / 60);
if (strlen($hours) == 1)
$hours = "0" . $hours;
if (strlen($secs) == 1)
$secs = "0" . $secs;
if (strlen($mins) == 1)
$mins = "0" . $mins;
if ($hours == 0)
$ret = "$mins:$secs";
else
$ret = "$hours:$mins:$secs";
return $ret;
}
echo mediaTimeDeFormater(216.064000);//3:36
Использовать по модулю:
$hours = $time_in_seconds / 3600;
$minutes = ($time_in_seconds / 60) % 60;
только один небольшой дополнительный пример
запрошено время в милисекундах
// ms2time( (microtime(true) - ( time() - rand(0,1000000) ) ) );
// return array
function ms2time($ms){
$return = array();
// ms
$return['ms'] = (int) number_format( ($ms - (int) $ms), 2, '', '');
$seconds = (int) $ms;
unset($ms);
if ($seconds%60 > 0){
$return['s'] = $seconds%60;
} else {
$return['s'] = 0;
}
if ( ($minutes = intval($seconds/60))){
$return['m'] = $minutes;
}
if (isset($return['m'])){
$return['h'] = intval($return['m'] / 60);
$return['m'] = $return['m'] % 60;
}
if (isset($return['h'])){
$return['d'] = intval($return['h'] / 24);
$return['h'] = $return['h'] % 24;
}
if (isset($return['d']))
$return['mo'] = intval($return['d'] / 30);
foreach($return as $k=>$v){
if ($v == 0)
unset($return[$k]);
}
return $return;
}
// ms2time2string( (microtime(true) - ( time() - rand(0,1000000) ) ) );
// return array
function ms2time2string($ms){
$array = array(
'ms' => 'ms',
's' => 'seconds',
'm' => 'minutes',
'h' => 'hours',
'd' => 'days',
'mo' => 'month',
);
if ( ( $return = ms2time($ms) ) && count($ms) > 0){
foreach($return as $key=>$data){
$return[$key] = $data .' '.$array[$key];
}
}
return implode(" ", array_reverse($return));
}
Вот еще один способ: "0" для всех из них.
$secCount = 10000;
$hours = str_pad(floor($secCount / (60*60)), 2, '0', STR_PAD_LEFT);
$minutes = str_pad(floor(($secCount - $hours*60*60)/60), 2, '0', STR_PAD_LEFT);
$seconds = str_pad(floor($secCount - ($hours*60*60 + $minutes*60)), 2, '0', STR_PAD_LEFT);
Это адаптация от ответа Flaxious.
Если вам нужен хороший формат, например: 0:00:00, используйте str_pad() как @Gardner.
1 день = 86400000 миллисекунд.
DecodeTime (миллисекунды/86400000, ч, мин, сек, мс)
Ups! Я думал в delphi, должно быть что-то похожее на всех языках.