2012-02-01 17 views
9

Próbuję wziąć dziesiętny i przekonwertować go tak, aby można go echo jako godziny, minuty i sekundy.Jak przekonwertować liczbę dziesiętną na czas, np. GG: MM: SS

Mam godziny i minuty, ale łamie mi mózg, próbując znaleźć sekundy. Przez jakiś czas szukałem google'a bez powodzenia. Jestem pewien, że to całkiem proste, ale nic, co próbowałem, nie zadziałało. Każda rada jest doceniana!

Oto co mam:

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

Tak jak mówiłem, mam godzinę i minuty bez problemu. Po prostu z jakiegoś powodu usiłuję zdobyć sekundy.

Dzięki!

+0

W jakim formacie jest, że „dziesiętny”? –

+0

to, co masz, również nie wydaje się słuszne. Czy możesz podać przykładowe dane wejściowe i oczekiwane wyniki? – Sorin

+0

Dziesiętny nie jest niczym specjalnym. Coś takiego jak 5,67891234. – HMFlol

Odpowiedz

15

Jeśli $dec jest w godzinach ($dec ponieważ Pytający specjalnie wspomniał dec 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

Dzięki za pomoc. To ma większy sens niż to, co próbowałem zrobić. :) – HMFlol

+0

@HMFlol: Miło mi pomóc. – Crontab

+2

Zamiast tworzyć funkcję 'lz', możesz użyć natywnej funkcji' str_pad', od PHP: 'str_pad ($ num, 2, 0, STR_PAD_LEFT)' – elboletaire

0

Nie jestem pewien, czy jest to najlepszy sposób, aby to zrobić, ale

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

Bardzo proste rozwiązanie w jednym wierszu:

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

To działa tak długo, jak nie masz 24 lub więcej godzin. – Crontab

+0

@Crontab Nie myślałem o tym :) Dzięki. – Cheery

+2

Czy to ma znaczenie, jeśli używasz 'date()' zamiast 'gmdate()'? – Staysee

3

Wszystko, co zostało przegłosowane, nie działało w moim przypadku. Użyłem tego rozwiązania do konwersji godzin dziesiętnych i minut na zwykły format czasu. tj

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

Jest to świetny sposób i pozwala uniknąć problemów z zmiennoprzecinkowej precyzji:

function convertTime($h) { 
    return [floor($h), (floor($h * 60) % 60), floor($h * 3600) % 60]; 
} 
Powiązane problemy