Convertir segundos a Hora: Minuto: Segundo


330

Necesito convertir segundos a "Hora: Minuto: Segundo".

Por ejemplo: "685" convertido a "00:11:25"

¿Cómo puedo conseguir esto?


44
la pregunta es ambigua: desea convertir su secondsa una date/timecantidad de horas: minutos: segundos?
WonderLand 01 de

Respuestas:


741

Puedes usar la gmdate()función:

echo gmdate("H:i:s", 685);

166
Sin embargo, es mejor asegurarse de que la cantidad de segundos sea inferior a 86,400.
salathe

12
H representa la cantidad de horas en un solo día. Entonces, si tiene 90000 segundos y usará H, el resultado será 01 (primera hora del día siguiente). NO 25: solo hay 24 horas en un día.
MarcinWolny

77
No estoy seguro de que esta sea la respuesta correcta, esto producirá un datetime... así que si esperamos resultados> 24 horas no funcionará. Además, si necesitamos algún resultado negativo (por ejemplo, trabajar con desplazamiento) no funcionará. -1para la alondra de los detalles
WonderLand 01 de

54
Esta no debería ser la respuesta aceptada debido a la falla obvia para tiempos que son mayores de 24 horas.
Scott Flack el

10
Para usar con días en los que los números pueden ser mayores que 85399, puede usar echo gmdate("z H:i:s", 685);z es la cantidad de días en el año que comienza con 0. Obviamente, puede revisar el manual de fecha php para satisfacer sus necesidades específicas.
Nightwolf

177

Una hora es 3600 segundos, un minuto es 60 segundos, entonces ¿por qué no?

<?php

$init = 685;
$hours = floor($init / 3600);
$minutes = floor(($init / 60) % 60);
$seconds = $init % 60;

echo "$hours:$minutes:$seconds";

?>

que produce:

$ php file.php
0:11:25

(No he probado tanto, por lo que puede haber errores con el piso más o menos)


Pero quiere dos ceros ... "00:11:25" no "0:11:25"
animuson

52
printf("%02d:%02d:%02d", $hours, $minutes, $seconds);
Ámbar

55
Buena respuesta, pero asegúrese de restar $ horas * 3600 y $ minutos * 60 de $ init entre cada operación; de lo contrario, terminará contando dos minutos y segundos.
Mike Stowe

55
Para agregar al comentario de @ Amber, use sprintfpara devolver el valor en lugar de imprimirlo.
Allen Butler

77

aqui tienes

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

1
No funciona para valores negativos. Si tiene un intervalo de segundos negativo, use esto:return ($t< 0 ? '-' : '') . sprintf("%02d%s%02d%s%02d", floor(abs($t)/3600), $f, (abs($t)/60)%60, $f, abs($t)%60); }
Ajax

66

Use la función gmdate() solo si los segundos son menos de 86400(1 día) :

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

Ver: gmdate ()

Ejecute la demo


Convierta segundos a formato por 'pie' sin límite * :

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

Ver: floor () , sprintf () , operadores aritméticos

Ejecute la demo


Ejemplo de uso de DateTimeextensión:

$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

Ver: DateTime :: __ construct () , DateTime :: modify () , clone , sprintf ()

Ejecute la demo


MySQL ejemplo gama del resultado se ve limitada a la del tipo de datos de tiempo, que es de -838:59:59a838:59:59 :

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

Ver: SEC_TO_TIME

Ejecute la demo


Ejemplo de PostgreSQL:

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

Ejecute la demo


30

Se usan otras soluciones gmdate, pero fallan en casos extremos donde tiene más de 86400 segundos. Para evitar esto, simplemente podemos calcular el número de horas nosotros mismos, luego dejar que gmdatelos segundos restantes se calculen en minutos / segundos.

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

Entrada: 6030 Salida:1:40:30

Entrada: 2000006030 Salida:555557:13:50


16
// 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

$ hms = gmdate ("H: i: s", 12720); no es suficiente para obtener Day-Hour-Min-Sec
Mughal

7
gmdate("H:i:s", no_of_seconds);

No dará tiempo en H:i:sformato si no_of_secondses mayor a 1 día (segundos en un día).
Descuidará el valor del día y dará soloHour:Min:Seconds

Por ejemplo:

gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42

6

Aquí hay una línea que maneja los segundos negativos y más de 1 día de segundos.

sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

Por ejemplo:

$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));

Salidas: -26: 03: 04


no funcionará si es negativo y menos de 1 hora: -3000 = 0:50:00 debería ser -0: 50: 00
Tony Brix

6

Si no te gustan las respuestas aceptadas o las populares, prueba esta.

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

5

función de escritura como esta para devolver una matriz

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

entonces simplemente llame a la función así:

secondsToTime(100);

la salida es

Array ( [h] => 0 [m] => 1 [s] => 40 )

4

Ver:

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

De: Convierte segundos en días, horas, minutos y segundos


3

Prueba esto:

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

Tomado de
http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss


No estoy completamente seguro, pero estoy bastante seguro de que está ajustando el tiempo a 0 y luego cualquier cosa además de eso sería la respuesta correcta
Kerry Jones

Esto pone los primeros 0 delante de los minutos, que no puede ajustar con date () - ca.php.net/manual/en/function.date.php
barfoon

@barfoon: es cierto, pero creo que esto es lo que M.Ezz estaba pidiendo, y es un estándar utilizado a tiempo. Esto se ve extraño por mi experiencia "3: 7: 5" en lugar de "03:07:05", o incluso "3: 7", me parece más una relación.
Kerry Jones

3

La función gmtdate () no funcionó para mí, ya que estaba rastreando las horas trabajadas en un proyecto y si son más de 24 horas, se obtiene la cantidad restante después de que se restan 24 horas. En otras palabras, 37 horas se convierten en 13 horas. (todo como lo indicó Glavic anteriormente, ¡gracias por sus ejemplos!) Este funcionó bien:

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

Esta función puede ser útil, podría extenderla:

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

2

Solución de: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

¡Aquí hay un método muy limpio y corto!

Este código evita en la medida de lo posible las tediosas llamadas a funciones y la construcción de cadenas pieza por pieza, y las funciones grandes y voluminosas que la gente está haciendo para esto.

Produce el formato "1h05m00s" y utiliza ceros a la izquierda durante minutos y segundos, siempre que otro componente de tiempo distinto de cero los preceda.

Y omite todos los componentes principales vacíos para evitar darle información inútil como "0h00m01s" (en su lugar, aparecerá como "1s").

Resultados de ejemplo: "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'; }

Si desea que el código sea aún más corto (pero menos legible), puede evitar la $convertedmatriz y, en su lugar, colocar los valores directamente en la llamada sprintf (), de la siguiente manera:

$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'; }

La duración debe ser 0 o superior en las dos piezas de código anteriores. Las duraciones negativas no son compatibles. Pero puede manejar duraciones negativas usando el siguiente código alternativo:

$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"

Tenga en cuenta que el gmdate()truco es incluso más corto que esto, pero solo admite duraciones de hasta 24 horas. ¡Cualquier cosa superior a 24 horas fallará si usa el truco gmdate!
gw0

1

Una manera simple de usar DateTime para esto es:

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

    //output:  01:04:65

Es una solución simple que le brinda la posibilidad de utilizar el formato Método de fecha y hora.


1

En java puedes usarlo de esta manera.

   private String getHmaa(long seconds) {
    String string;
    int hours = (int) seconds / 3600;
    int remainder = (int) seconds - hours * 3600;
    int mins = remainder / 60;
    //remainder = remainder - mins * 60;
    //int secs = remainder;

    if (hours < 12 && hours > 0) {
        if (mins < 10) {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    } else if (hours >= 12) {
        if (mins < 10) {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? "0" + mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        } else {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        }
    } else {
        if (mins < 10) {
            string = String.valueOf("0" + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf("0" + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    }
    return string;
}

0
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

Bueno, necesitaba algo que redujera los segundos a horas, minutos y segundos, pero que excedería las 24 horas y que no se redujera aún más en días.

Aquí hay una función simple que funciona. Probablemente puedas mejorarlo ... Pero aquí está:

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
$given = 685;

 /*
 * In case $given == 86400, gmdate( "H" ) will convert it into '00' i.e. midnight.
 * We would need to take this into consideration, and so we will first
 * check the ratio of the seconds i.e. $given:$number_of_sec_in_a_day
 * and then after multiplying it by the number of hours in a day (24), we
 * will just use "floor" to get the number of hours as the rest would
 * be the minutes and seconds anyways.
 *
 * We can also have minutes and seconds combined in one variable,
 * e.g. $min_sec = gmdate( "i:s", $given );
 * But for versatility sake, I have taken them separately.
 */

$hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

$min = gmdate( "i", $given );

$sec = gmdate( "s", $given );

echo $formatted_string = $hours.':'.$min.':'.$sec;

Para convertirlo en una función:

function getHoursFormat( $given ){

 $hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

 $min = gmdate( "i", $given );

 $sec = gmdate( "s", $given );

 $formatted_string = $hours.':'.$min.':'.$sec;

 return $formatted_string;

}


0

Si desea crear una cadena de duración de audio / video como YouTube, etc., puede hacer:

($seconds >= 60) ? ltrim(gmdate("H:i:s", $seconds), ":0") : gmdate("0:s", $seconds)

Devolverá cadenas como:

55.55 => '0:55'
100   => '1:40'

Probablemente no funcionará bien por tiempo> = 24 horas.


0

Esta es una bonita manera de hacer eso:

function time_converter($sec_time, $format='h:m:s'){
      $hour = intval($sec_time / 3600) >= 10 ? intval($sec_time / 3600) : '0'.intval($sec_time / 3600);
      $minute = intval(($sec_time % 3600) / 60) >= 10 ? intval(($sec_time % 3600) / 60) : '0'.intval(($sec_time % 3600) / 60);
      $sec = intval(($sec_time % 3600) % 60)  >= 10 ? intval(($sec_time % 3600) % 60) : '0'.intval(($sec_time % 3600) % 60);

      $format = str_replace('h', $hour, $format);
      $format = str_replace('m', $minute, $format);
      $format = str_replace('s', $sec, $format);

      return $format;
    }

-1

En caso de que alguien más esté buscando una función simple para devolver este formato agradable (sé que no es el formato que solicitó el OP), esto es lo que acabo de inventar. Gracias a @mughal por el código en el que se basó.

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

Cualquiera que busque esto en el futuro, esto le dará el formato que solicitó el póster inicial.

$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";

-3
<?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, ";
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.