Мне нужно конвертировать секунды в «Hour: Minute: Second».
Например: «685» преобразован в «00:11:25»
Как я могу это достичь?
Вы можете использовать gmdate()
:
echo gmdate("H:i:s", 685);
Один час 3600 секунд, одна минута 60 секунд, так почему бы и нет:
<?php $init = 685; $hours = floor($init / 3600); $minutes = floor(($init / 60) % 60); $seconds = $init % 60; echo "$hours:$minutes:$seconds"; ?>
который производит:
$ php file.php 0:11:25
(Я не тестировал это, так что могут быть ошибки с полом или около того)
Ну вот
function format_time($t,$f=':') // t = seconds, f = separator { return sprintf("%02d%s%02d%s%02d", floor($t/3600), $f, ($t/60)%60, $f, $t%60); } echo format_time(685); // 00:11:25
Используйте функцию gmdate()
только если секунды меньше 86400
(1 день) :
$seconds = 8525; echo gmdate('H:i:s', $seconds); # 02:22:05
См .: gmdate ()
Запустить демоверсию
Преобразование секунд в формат «нога» без ограничений * :
$seconds = 8525; $H = floor($seconds / 3600); $i = ($seconds / 60) % 60; $s = $seconds % 60; echo sprintf("%02d:%02d:%02d", $H, $i, $s); # 02:22:05
Смотрите: floor () , sprintf () , арифметические операторы
Запустить демоверсию
Пример использования расширения DateTime
:
$seconds = 8525; $zero = new DateTime("@0"); $offset = new DateTime("@$seconds"); $diff = $zero->diff($offset); echo sprintf("%02d:%02d:%02d", $diff->days * 24 + $diff->h, $diff->i, $diff->s); # 02:22:05
См .: DateTime :: __ construct () , DateTime :: modify () , clone , sprintf ()
Запустить демоверсию
Примерный диапазон результатов MySQL ограничен типом данных типа TIME, который составляет от -838:59:59
до 838:59:59
:
SELECT SEC_TO_TIME(8525); # 02:22:05
См .: SEC_TO_TIME
Запустить демоверсию
Пример PostgreSQL:
SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS'); # 02:22:05
Запустить демоверсию
Другие решения используют gmdate
, но не gmdate
в крайних случаях, когда у вас более 86400 секунд. Чтобы обойти это, мы можем просто вычислить количество секунд, а затем дать gmdate
вычислить оставшиеся секунды в минутах / секундах.
echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);
Вход: 6030
Выход: 1:40:30
Вход: 2000006030
Выход: 555557:13:50
// TEST // 1 Day 6 Hours 50 Minutes 31 Seconds ~ 111031 seconds $time = 111031; // time duration in seconds $days = floor($time / (60 * 60 * 24)); $time -= $days * (60 * 60 * 24); $hours = floor($time / (60 * 60)); $time -= $hours * (60 * 60); $minutes = floor($time / 60); $time -= $minutes * 60; $seconds = floor($time); $time -= $seconds; echo "{$days}d {$hours}h {$minutes}m {$seconds}s"; // 1d 6h 50m 31s
gmdate("H:i:s", no_of_seconds);
Не no_of_seconds
время в формате H:i:s
, если no_of_seconds
больше 1 дня (секунды в день).
Он будет пренебрегать дневным значением и давать только Hour:Min:Seconds
Например:
gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42
Вот один лайнер, который обрабатывает отрицательные секунды и более 1 дня в секундах.
sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));
Например:
$seconds= -24*60*60 - 2*60*60 - 3*60 - 4; // minus 1 day 2 hours 3 minutes 4 seconds echo sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));
выходов: -26: 03: 04
напишите такую функцию, чтобы вернуть массив
function secondsToTime($seconds) { // extract hours $hours = floor($seconds / (60 * 60)); // extract minutes $divisor_for_minutes = $seconds % (60 * 60); $minutes = floor($divisor_for_minutes / 60); // extract the remaining seconds $divisor_for_seconds = $divisor_for_minutes % 60; $seconds = ceil($divisor_for_seconds); // return the final array $obj = array( "h" => (int) $hours, "m" => (int) $minutes, "s" => (int) $seconds, ); return $obj; }
то просто вызовите функцию следующим образом:
secondsToTime(100);
выход
Array ( [h] => 0 [m] => 1 [s] => 40 )
Видеть:
/** * Convert number of seconds into hours, minutes and seconds * and return an array containing those values * * @param integer $inputSeconds Number of seconds to parse * @return array */ function secondsToTime($inputSeconds) { $secondsInAMinute = 60; $secondsInAnHour = 60 * $secondsInAMinute; $secondsInADay = 24 * $secondsInAnHour; // extract days $days = floor($inputSeconds / $secondsInADay); // extract hours $hourSeconds = $inputSeconds % $secondsInADay; $hours = floor($hourSeconds / $secondsInAnHour); // extract minutes $minuteSeconds = $hourSeconds % $secondsInAnHour; $minutes = floor($minuteSeconds / $secondsInAMinute); // extract the remaining seconds $remainingSeconds = $minuteSeconds % $secondsInAMinute; $seconds = ceil($remainingSeconds); // return the final array $obj = array( 'd' => (int) $days, 'h' => (int) $hours, 'm' => (int) $minutes, 's' => (int) $seconds, ); return $obj; }
From: Конвертировать секунды в дни, часы, минуты и секунды.
Функция gmtdate () не работала для меня, поскольку я отслеживал часы работы над проектом, и если это более 24 часов, вы получаете оставшееся количество после 24 часов. Другими словами, 37 часов составляют 13 часов. (все, как указано выше, Glavic – спасибо за ваши примеры!) Это хорошо работает:
Convert seconds to format by 'foot' no limit : $seconds = 8525; $H = floor($seconds / 3600); $i = ($seconds / 60) % 60; $s = $seconds % 60; echo sprintf("%02d:%02d:%02d", $H, $i, $s); # 02:22:05
Попробуй это:
date("H:i:s",-57600 + 685);
Взято из
http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss
Эта функция может быть полезной, вы можете ее расширить:
function formatSeconds($seconds) { if(!is_integer($seconds)) { return FALSE; } $fmt = ""; $days = floor($seconds / 86400); if($days) { $fmt .= $days."D "; $seconds %= 86400; } $hours = floor($seconds / 3600); if($hours) { $fmt .= str_pad($hours, 2, '0', STR_PAD_LEFT).":"; $seconds %= 3600; } $mins = floor($seconds / 60 ); if($mins) { $fmt .= str_pad($mins, 2, '0', STR_PAD_LEFT).":"; $seconds %= 60; } $fmt .= str_pad($seconds, 2, '0', STR_PAD_LEFT); return $fmt;}
Простой способ использования DateTime для этого:
$time = 60; //sec. $now = time(); $rep = new DateTime('@'.$now); $diff = new DateTime('@'.($now+$time)); $return = $diff->diff($rep)->format($format); //output: 01:04:65
Это простое решение, которое дает вам возможность использовать формат Method of DateTime.
Решение от: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b
Этот код избегает как можно большего количества утомительных вызовов функций и поэтапного построения строк, а также больших и громоздких функций, которые люди делают для этого.
Он создает формат «1h05m00s» и использует ведущие нули в течение минут и секунд, пока предшествует другой ненулевой компонент времени.
И он пропускает все пустые ведущие компоненты, чтобы не давать вам бесполезную информацию типа «0h00m01s» (вместо этого она будет отображаться как «1s»).
Примеры результатов: «1s», «1m00s», «19m08s», «1h00m00s», «4h08m39s».
$duration = 1; // values 0 and higher are supported! $converted = [ 'hours' => floor( $duration / 3600 ), 'minutes' => floor( ( $duration / 60 ) % 60 ), 'seconds' => ( $duration % 60 ) ]; $result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' ); if( $result == 's' ) { $result = '0s'; }
Если вы хотите сделать код еще короче (но менее читаемым), вы можете избежать $converted
массива и вместо этого поместить значения непосредственно в вызов sprintf () следующим образом:
$duration = 1; // values 0 and higher are supported! $result = ltrim( sprintf( '%02dh%02dm%02ds', floor( $duration / 3600 ), floor( ( $duration / 60 ) % 60 ), ( $duration % 60 ) ), '0hm' ); if( $result == 's' ) { $result = '0s'; }
Продолжительность должна быть 0 или выше в обеих частях кода выше. Отрицательная длительность не поддерживается. Но вы можете обрабатывать отрицательную длительность, используя вместо этого следующий альтернативный код:
$duration = -493; // negative values are supported! $wasNegative = FALSE; if( $duration < 0 ) { $wasNegative = TRUE; $duration = abs( $duration ); } $converted = [ 'hours' => floor( $duration / 3600 ), 'minutes' => floor( ( $duration / 60 ) % 60 ), 'seconds' => ( $duration % 60 ) ]; $result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' ); if( $result == 's' ) { $result = '0s'; } if( $wasNegative ) { $result = "-{$result}"; } // $result is now "-8m13s"
function timeToSecond($time){ $time_parts=explode(":",$time); $seconds= ($time_parts[0]*86400) + ($time_parts[1]*3600) + ($time_parts[2]*60) + $time_parts[3] ; return $seconds; } function secondToTime($time){ $seconds = $time % 60; $seconds<10 ? "0".$seconds : $seconds; if($seconds<10) { $seconds="0".$seconds; } $time = ($time - $seconds) / 60; $minutes = $time % 60; if($minutes<10) { $minutes="0".$minutes; } $time = ($time - $minutes) / 60; $hours = $time % 24; if($hours<10) { $hours="0".$hours; } $days = ($time - $hours) / 24; if($days<10) { $days="0".$days; } $time_arr = array($days,$hours,$minutes,$seconds); return implode(":",$time_arr); }
Ну, мне нужно было что-то, что сокращало бы секунды в часах минут и секунд, но превысило бы 24 часа, а не уменьшалось бы дальше до дней.
Вот простая функция, которая работает. Вы, вероятно, можете улучшить его … Но вот он:
function formatSeconds($seconds) { $hours = 0;$minutes = 0; while($seconds >= 60){$seconds -= 60;$minutes++;} while($minutes >= 60){$minutes -=60;$hours++;} $hours = str_pad($hours, 2, '0', STR_PAD_LEFT); $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); $seconds = str_pad($seconds, 2, '0', STR_PAD_LEFT); return $hours.":".$minutes.":".$seconds; }
На всякий случай кто-то ищет простую функцию, чтобы вернуть это красиво отформатированное (я знаю, что это не тот формат, который запросил OP), вот что я только что придумал. Благодаря @mughal для кода, на котором это было основано.
function format_timer_result($time_in_seconds){ $time_in_seconds = ceil($time_in_seconds); // Check for 0 if ($time_in_seconds == 0){ return 'Less than a second'; } // Days $days = floor($time_in_seconds / (60 * 60 * 24)); $time_in_seconds -= $days * (60 * 60 * 24); // Hours $hours = floor($time_in_seconds / (60 * 60)); $time_in_seconds -= $hours * (60 * 60); // Minutes $minutes = floor($time_in_seconds / 60); $time_in_seconds -= $minutes * 60; // Seconds $seconds = floor($time_in_seconds); // Format for return $return = ''; if ($days > 0){ $return .= $days . ' day' . ($days == 1 ? '' : 's'). ' '; } if ($hours > 0){ $return .= $hours . ' hour' . ($hours == 1 ? '' : 's') . ' '; } if ($minutes > 0){ $return .= $minutes . ' minute' . ($minutes == 1 ? '' : 's') . ' '; } if ($seconds > 0){ $return .= $seconds . ' second' . ($seconds == 1 ? '' : 's') . ' '; } $return = trim($return); return $return; }
Любой, кто ищет это в будущем, дает формат, который запрашивал первоначальный плакат.
$init = 685; $hours = floor($init / 3600); $hrlength=strlen($hours); if ($hrlength==1) {$hrs="0".$hours;} else {$hrs=$hours;} $minutes = floor(($init / 60) % 60); $minlength=strlen($minutes); if ($minlength==1) {$mins="0".$minutes;} else {$mins=$minutes;} $seconds = $init % 60; $seclength=strlen($seconds); if ($seclength==1) {$secs="0".$seconds;} else {$secs=$seconds;} echo "$hrs:$mins:$secs";
<?php $time=3*3600 + 30*60; $year=floor($time/(365*24*60*60)); $time-=$year*(365*24*60*60); $month=floor($time/(30*24*60*60)); $time-=$month*(30*24*60*60); $day=floor($time/(24*60*60)); $time-=$day*(24*60*60); $hour=floor($time/(60*60)); $time-=$hour*(60*60); $minute=floor($time/(60)); $time-=$minute*(60); $second=floor($time); $time-=$second; if($year>0){ echo $year." year, "; } if($month>0){ echo $month." month, "; } if($day>0){ echo $day." day, "; } if($hour>0){ echo $hour." hour, "; } if($minute>0){ echo $minute." minute, "; } if($second>0){ echo $second." second, "; }
в<?php $time=3*3600 + 30*60; $year=floor($time/(365*24*60*60)); $time-=$year*(365*24*60*60); $month=floor($time/(30*24*60*60)); $time-=$month*(30*24*60*60); $day=floor($time/(24*60*60)); $time-=$day*(24*60*60); $hour=floor($time/(60*60)); $time-=$hour*(60*60); $minute=floor($time/(60)); $time-=$minute*(60); $second=floor($time); $time-=$second; if($year>0){ echo $year." year, "; } if($month>0){ echo $month." month, "; } if($day>0){ echo $day." day, "; } if($hour>0){ echo $hour." hour, "; } if($minute>0){ echo $minute." minute, "; } if($second>0){ echo $second." second, "; }
за<?php $time=3*3600 + 30*60; $year=floor($time/(365*24*60*60)); $time-=$year*(365*24*60*60); $month=floor($time/(30*24*60*60)); $time-=$month*(30*24*60*60); $day=floor($time/(24*60*60)); $time-=$day*(24*60*60); $hour=floor($time/(60*60)); $time-=$hour*(60*60); $minute=floor($time/(60)); $time-=$minute*(60); $second=floor($time); $time-=$second; if($year>0){ echo $year." year, "; } if($month>0){ echo $month." month, "; } if($day>0){ echo $day." day, "; } if($hour>0){ echo $hour." hour, "; } if($minute>0){ echo $minute." minute, "; } if($second>0){ echo $second." second, "; }