Преобразование секунд в Час:Минута:Секунда


Мне нужно преобразовать секунды в "Час:Минута:Секунда".

Например: "685" преобразовано в "00:11:25"

Как я могу этого добиться?

 280
Author: Paolo Forgia, 2010-07-03

22 answers

Вы можете использовать gmdate() функция:

echo gmdate("H:i:s", 685);
 632
Author: animuson, 2010-07-03 18:03:34

Один час составляет 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

(Я не так много тестировал, так что могут быть ошибки с полом или около того)

 148
Author: Aif, 2010-07-03 18:07:11

Вот, пожалуйста

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
 65
Author: nathan, 2010-07-03 19:40:57

Использовать функцию gmdate() только если секунд меньше 86400 (1 день) :

$seconds = 8525;
echo gmdate('H:i:s', $seconds);
# 02:22:05

См.: дата по Гринвичу()

Запустите демонстрационную версию


Преобразование секунд в формат "фут" без ограничений* :

$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

См.: этаж(), спринтф(), арифметические операторы

Запустите демонстрационную версию


Пример использования расширения 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::__конструкт(), типа datetime::изменения(), Клон, Ом()

Запустите демонстрационную версию


Пример MySQL диапазон результата ограничен типом данных ВРЕМЕНИ, который составляет от -838:59:59 до 838:59:59 :

SELECT SEC_TO_TIME(8525);
# 02:22:05

См.: СЕК_ТО_ВРЕМЕНИ

Запустите демонстрационную версию


Пример PostgreSQL:

SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS');
# 02:22:05

Запустите демонстрационную версию

 59
Author: Glavić, 2017-06-13 18:38:46

Другие решения используют gmdate, но терпят неудачу в крайних случаях, когда у вас есть более 86400 секунд. Чтобы обойти это, мы можем просто сами вычислить количество часов, а затем позволить gmdate вычислить оставшиеся секунды в минутах/секундах.

echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);

Ввод: 6030 Выход: 1:40:30

Ввод: 2000006030 Выход: 555557:13:50

 23
Author: RaDim, 2018-04-16 10:44:31
// 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
 15
Author: mughal, 2013-08-03 16:55:08
gmdate("H:i:s", 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
 7
Author: Vikash Kumar, 2015-07-15 18:24:35

Вот один лайнер, который обрабатывает отрицательные секунды и секунды продолжительностью более 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

 6
Author: Benjamin, 2014-09-05 15:42:56

Напишите такую функцию, чтобы возвращать массив

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 )
 5
Author: vamsikrishnamannem, 2015-04-09 16:32:11

См.:

    /** 
     * 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;
    }

Из: Преобразование секунд в дни, часы, минуты и секунды

 4
Author: FooBar, 2017-05-23 12:34:45

Функция gmtdate() не работала для меня, так как я отслеживал часы работы над проектом, и если это более 24 часов, вы получаете сумму, оставшуюся после вычитания 24 часов. Другими словами, 37 часов становятся 13 часами. (все, как указано выше Главичем - спасибо за ваши примеры!) Это сработало хорошо:

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
 3
Author: TotalPro, 2014-02-05 21:43:05

Эта функция может быть полезной, вы могли бы расширить ее:

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;}
 3
Author: AMCoded, 2016-05-06 16:10:21

Попробуйте это:

date("H:i:s",-57600 + 685);

Взято из
http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss

 2
Author: Kerry Jones, 2010-07-03 17:58:48

Если вам не нравится принятый ответ или популярный один раз, попробуйте этот

function secondsToTime($seconds_time)
{
    if ($seconds_time < 24 * 60 * 60) {
        return gmdate('H:i:s', $seconds_time);
    } else {
        $hours = floor($seconds_time / 3600);
        $minutes = floor(($seconds_time - $hours * 3600) / 60);
        $seconds = floor($seconds_time - ($hours * 3600) - ($minutes * 60));
        return "$hours:$minutes:$seconds";
    }
}

secondsToTime(108620); // 30:10:20
 2
Author: Eranda, 2018-02-01 07:06:30

Простой способ использовать для этого дату и время:

    $time = 60; //sec.
    $now = time();
    $rep = new DateTime('@'.$now);
    $diff = new DateTime('@'.($now+$time));
    $return = $diff->diff($rep)->format($format);

    //output:  01:04:65

Это простое решение, которое дает вам возможность использовать метод форматирования даты и времени.

 1
Author: predkony, 2014-07-24 13:57:12

Решение из: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

Вот очень чистый и короткий метод!

Этот код максимально избегает утомительных вызовов функций и построения строк по частям, а также больших и громоздких функций, которые люди делают для этого.

Он создает формат "1h05m00s" и использует начальные нули для минут и секунд, если им предшествует другой ненулевой компонент времени.

И это пропускает все пустые начальные компоненты, чтобы избежать предоставления вам бесполезной информации, такой как "0h00m01s" (вместо этого она будет отображаться как "1s").

Пример результатов: "1с", "1м00с", "19м08с", "1ч00м00с", "4ч08м39с".

$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"
 1
Author: ThatBigGuy, 2017-02-05 18:21:20
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);
}
 0
Author: anu g prem, 2016-10-17 11:01:14

Ну, мне нужно было что-то, что сократило бы секунды в часы, минуты и секунды, но превысило бы 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;
}
 0
Author: Paul Ishak, 2017-10-02 14:03:36

На всякий случай, если кто-то еще ищет простую функцию для возврата этого красиво отформатированного (я знаю, что это не тот формат, который запрашивал ОП), это то, что я только что придумал. Спасибо @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;
}
 -1
Author: Luke Cousins, 2013-12-23 15:31:37

Всем, кто ищет это в будущем, это дает формат, о котором просил первоначальный плакат.

$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";
 -1
Author: Gordon, 2013-12-27 16:11:50

Как насчет

print date('H:i:s', mktime(0, 0, 685, 0, 0));

Без каких-либо расширений

 -1
Author: Zgr3doo, 2018-06-04 14:33:39
<?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, ";
}
 -3
Author: Ibrahim Akbar, 2016-08-13 20:51:07