2012-02-01 21 views
9

Estoy tratando de tomar un decimal y convertirlo para que pueda repetirlo como horas, minutos y segundos.Cómo convertir un decimal en tiempo, ej. HH: MM: SS

Tengo las horas y los minutos, pero estoy rompiendo mi cerebro tratando de encontrar los segundos. He estado buscando en Google por un tiempo sin suerte. Estoy seguro de que es bastante simple, pero nada de lo que he intentado ha funcionado. ¡Cualquier consejo es apreciado!

Aquí es lo que tengo:

function convertTime($dec) 
{ 
    $hour = floor($dec); 
    $min = round(60*($dec - $hour)); 
} 

Como dije, me da la hora y los minutos sin ningún problema. Solo luchando por obtener segundos por alguna razón.

Gracias!

+0

¿En qué formato es que "decimal"? –

+0

lo que tienes no parece correcto también. ¿Puedes proporcionar una entrada de muestra y una salida esperada? – Sorin

+0

El decimal no es nada especial. Algo así como 5.67891234. – HMFlol

Respuesta

15

Si $dec es en horas ($dec ya que el autor de la pregunta menciona específicamente un diciembre IMAL):

function convertTime($dec) 
{ 
    // start by converting to seconds 
    $seconds = ($dec * 3600); 
    // we're given hours, so let's get those the easy way 
    $hours = floor($dec); 
    // since we've "calculated" hours, let's remove them from the seconds variable 
    $seconds -= $hours * 3600; 
    // calculate minutes left 
    $minutes = floor($seconds/60); 
    // remove those from seconds as well 
    $seconds -= $minutes * 60; 
    // return the time formatted HH:MM:SS 
    return lz($hours).":".lz($minutes).":".lz($seconds); 
} 

// lz = leading zero 
function lz($num) 
{ 
    return (strlen($num) < 2) ? "0{$num}" : $num; 
} 
+0

Gracias por la ayuda. Eso tiene más sentido de lo que estaba tratando de hacer. :) – HMFlol

+0

@HMFlol: Me alegra ayudar. – Crontab

+2

En lugar de crear la función 'lz', puede usar la función nativa' str_pad', de PHP: 'str_pad ($ num, 2, 0, STR_PAD_LEFT)' – elboletaire

0

No estoy seguro si esto es la mejor manera de hacer esto, pero

$variabletocutcomputation = 60 * ($dec - $hour); 
$min = round($variabletocutcomputation); 
$sec = round((60*($variabletocutcomputation - $min))); 
7

Solución muy simple en una línea:

echo gmdate('H:i:s', floor(5.67891234 * 3600)); 
+4

Eso funciona siempre que no tenga 24 o más horas. – Crontab

+0

@Crontab No lo pensé :) Gracias. – Cheery

+2

¿Importa si usa 'date()' en lugar de 'gmdate()'? – Staysee

3

Todo lo votado no funcionó en mi caso. He usado esa solución para convertir horas y minutos decimales a formato de tiempo normal. decir

function clockalize($in){ 

    $h = intval($in); 
    $m = round((((($in - $h)/100.0) * 60.0) * 100), 0); 
    if ($m == 60) 
    { 
     $h++; 
     $m = 0; 
    } 
    $retval = sprintf("%02d:%02d", $h, $m); 
    return $retval; 
} 


clockalize("17.5"); // 17:30 
0

Esta es una gran manera y evita problemas con la precisión de coma flotante:

function convertTime($h) { 
    return [floor($h), (floor($h * 60) % 60), floor($h * 3600) % 60]; 
} 
Cuestiones relacionadas