Scorpion King
Scorpion King

Reputation: 1938

Output is in seconds. convert to hh:mm:ss format in php

  1. My output is in the format of 290.52262423327 seconds. How can i change this to 00:04:51?

  2. The same output i want to show in seconds and in HH:MM:SS format, so if it is seconds, i want to show only 290.52 seconds.(only two integers after decimal point)? how can i do this?

I am working in php and the output is present in $time variable. want to change this $time into $newtime with HH:MM:SS and $newsec as 290.52.

Thanks :)

Upvotes: 64

Views: 61426

Answers (16)

VolkerK
VolkerK

Reputation: 96159

function foo($seconds) {
  $t = round($seconds);
  return sprintf('%02d:%02d:%02d', $t/3600, floor($t/60)%60, $t%60);
}

echo foo('290.52262423327'), "\n";
echo foo('9290.52262423327'), "\n";
echo foo(86400+120+6), "\n";

prints

00:04:51
02:34:51
24:02:06
echo round($time, 2);

Update Note:

function foo($seconds) {
  $t = round($seconds);
  // Deprecated: Implicit conversion from float ***.** to int loses precision
  // return sprintf('%02d:%02d:%02d', ($t/3600),($t/60%60), $t%60);

  // return sprintf('%02d:%02d:%02d', $t/3600, ($t%3600)/60, $t%60);
  return sprintf('%02d:%02d:%02d', $t/3600, floor($t/60)%60, $t%60);
}

Upvotes: 139

lubosdz
lubosdz

Reputation: 4500

Simple formatter with progressively added parts - sample:

  • formatTime(123) => 2m 3s
  • formatTime(7400) => 2h 3m 20s
  • formatTime(999999) => 11d 13h 46m 39s

function formatTime($secs)
{
    $secs = max(0, intval($secs));
    if($secs > 0){
        $out = [];
        $yrs = floor($secs / 31536e3);
        if($yrs){
            $out[] = $yrs."y";
        }
        $rem = $secs - $yrs * 31536e3;
        $days = floor($rem / 86400);
        if($days || $out){
            $out[] = $days."d";
        }
        $rem -= $days * 86400;
        $hrs = floor($rem / 3600);
        if($hrs || $out){
            $out[] = $hrs."h";
        }
        $rem -= $hrs * 3600;
        $min = floor($rem / 60);
        if($min || $out){
            $out[] = $min."m";
        }
        $rem -= $min * 60;
        $out[] = $rem."s";
        return implode(" ", $out);
    }
    return 0;
}

Upvotes: 2

TFleschenberg
TFleschenberg

Reputation: 51

echo date('H:i:s', round($time)%86400);

Upvotes: 0

Teekin
Teekin

Reputation: 13259

Edit: A comment pointed out that the previous answer fails if the number of seconds exceeds a day (86400 seconds). Here's an updated version. The OP did not specify this requirement so this may be implemented differently than the OP might expect, and there may be much better answers here already. I just couldn't stand having provided an answer with this bug.

$iSecondsIn = 290.52262423327;

// Account for days.
$iDaysOut = 0;
while ($iSecondsIn >= 86400) {
    $iDaysOut += 1;
    $iSecondsIn -= 86400;
}

// Display number of days if appropriate.
if ($iDaysOut > 0) {
    print $iDaysOut.' days and ';
}

// Print the final product.
print date('H:i:s', mktime(0, 0, $iSecondsIn));

The old version, with the bug:

$iSeconds = 290.52262423327;
print date('H:i:s', mktime(0, 0, $iSeconds));

Upvotes: 4

William Desportes
William Desportes

Reputation: 1701

Here was my implementation with microseconds

    /**
     * @example 00 d 00 h 00 min 00 sec 005098 ms (0.005098 sec.ms)
     */
    public function __toString()
    {
        // Add your code to get $seconds and $microseconds
        $time = round(($seconds + $microseconds), 6, PHP_ROUND_HALF_UP);

        return sprintf(
            '%02d d %02d h %02d min %02d sec %06d ms (%s sec.ms)',
            $time / 86400,
            ($time / 3600) % 24,
            ($time / 60) % 60,
            $time % 60,
            $time * 1000000 % 1000000,
            $time
        );
    }

Upvotes: 0

GuyPaddock
GuyPaddock

Reputation: 2517

Based on https://stackoverflow.com/a/3534705/4342230, but adding days:

function durationToString($seconds) {
  $time = round($seconds);

  return sprintf(
    '%02dD:%02dH:%02dM:%02dS',
    $time / 86400,
    ($time / 3600) % 24,
    ($time / 60) % 60,
    $time % 60
  );
}

Upvotes: 3

Mannu saraswat
Mannu saraswat

Reputation: 1081

For till 23:59:59 hours you can use PHP default function

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

Which will only return the result till 23:59:59

If your seconds is more then 86399 than with the help of @VolkerK answer

$time = round($seconds);
echo sprintf('%02d:%02d:%02d', ($time/3600),($time/60%60), $time%60);

will be the best options to use ...

Upvotes: 4

Ryan
Ryan

Reputation: 24035

If you're using Carbon (such as in Laravel), you can do this:

$timeFormatted = \Carbon\Carbon::now()->startOfDay()->addSeconds($seconds)->toTimeString();

But $timeFormatted = date("H:i:s", $seconds); is probably good enough.

Just see caveats.

Upvotes: 0

PassiveModding
PassiveModding

Reputation: 29

Personally, going off other peoples answers I made my own parser. Works with days, hours, minutes and seconds. And should be easy to expand to weeks/months etc. It works with deserialisation to c# as well

function secondsToTimeInterval($seconds) {
    $t = round($seconds);
    $days = floor($t/86400);
    $day_sec = $days*86400;
    $hours = floor( ($t-$day_sec) / (60 * 60) );
    $hour_sec = $hours*3600;
    $minutes = floor((($t-$day_sec)-$hour_sec)/60);
    $min_sec = $minutes*60;
    $sec = (($t-$day_sec)-$hour_sec)-$min_sec;
    return sprintf('%02d:%02d:%02d:%02d', $days, $hours, $minutes, $sec);
}

Upvotes: 1

Zagloo
Zagloo

Reputation: 1387

Try this :)

private function conversionTempsEnHms($tempsEnSecondes)
    {
        $h = floor($tempsEnSecondes / 3600);
        $reste_secondes = $tempsEnSecondes - $h * 3600;

        $m = floor($reste_secondes / 60);
        $reste_secondes = $reste_secondes - $m * 60;

        $s = round($reste_secondes, 3); 
        $s = number_format($s, 3, '.', '');

        $h = str_pad($h, 2, '0', STR_PAD_LEFT);
        $m = str_pad($m, 2, '0', STR_PAD_LEFT);
        $s = str_pad($s, 6, '0', STR_PAD_LEFT);

        $temps = $h . ":" . $m . ":" . $s;

        return $temps;
    }

Upvotes: 1

Serge
Serge

Reputation: 332

I dont know if this is the most efficient way, but if you also need to display days, this works:

function foo($seconds) { 
$t = round($seconds); 
return sprintf('%02d  %02d:%02d:%02d', ($t/86400%24), ($t/3600) -(($t/86400%24)*24),($t/60%60), $t%60);
}

Upvotes: 1

Azam Alvi
Azam Alvi

Reputation: 7055

Try this one

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

Upvotes: 27

MartyIX
MartyIX

Reputation: 28648

Try this:

$time = 290.52262423327;
echo date("h:i:s", mktime(0,0, round($time) % (24*3600)));

Upvotes: 2

Rob K
Rob K

Reputation: 8926

1)

$newtime = sprintf( "%02d:%02d:%02d", $time / 3600, $time / 60 % 60, $time % 60 );

2)

$newsec = sprintf( "%.2f", $time );

Upvotes: 0

Dejan Marjanović
Dejan Marjanović

Reputation: 19380

Numero uno... http://www.ckorp.net/sec2time.php (use this function)

Numero duo... echo round(290.52262423327,2);

Upvotes: -1

Mark Baker
Mark Baker

Reputation: 212412

echo date('H:i:s',$time);

echo number_format($time,2);

Upvotes: -1

Related Questions