2012-02-01 14 views
9

Sto cercando di prendere un decimale e convertirlo in modo da poterlo echeggiare come ore, minuti e secondi.Come convertire un numero decimale in tempo, ad es. HH: MM: SS

Ho le ore e i minuti, ma sto rompendo il cervello cercando di trovare i secondi. State googling per un po 'senza fortuna. Sono sicuro che sia abbastanza semplice, ma non ho funzionato. Qualche consiglio è apprezzato!

Ecco quello che ho:

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

Come ho detto, ho l'ora ei minuti senza alcun problema. Sto solo cercando di ottenere secondi per qualche motivo.

Grazie!

+0

In quale formato è che "decimale"? –

+0

quello che hai non sembra giusto anche. Puoi fornire un input di esempio e un output atteso? – Sorin

+0

Il numero decimale non è niente di speciale. Qualcosa come 5.67891234. – HMFlol

risposta

15

Se $dec è in ore ($dec dal momento che il richiedente ha specificamente menzionato un dicembre 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

Grazie per l'aiuto. Ha più senso di quello che stavo cercando di fare. :) – HMFlol

+0

@HMFlol: Felice di aiutare. – Crontab

+2

Invece di creare la funzione 'lz', puoi usare la funzione nativa' str_pad', da PHP: 'str_pad ($ num, 2, 0, STR_PAD_LEFT)' – elboletaire

0

Non sono sicuro se questo è il modo migliore per farlo, ma

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

Soluzione molto semplice in una riga:

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

Funziona finché non ci sono 24 o più ore. – Crontab

+0

@Crontab Non ci pensavo :) Grazie. – Cheery

+2

Ha importanza se usi 'date()' invece di 'gmdate()'? – Staysee

3

Tutto il upvoted non ha funzionato nel mio caso. Ho usato questa soluzione per convertire ore decimali e minuti in formato orario normale. cioè

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

Questo è un ottimo modo ed evita problemi con precisione in virgola mobile:

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