I've always wondered why a function like this isn't a built-in part of PHP, as it seems to have a lot of other useful stuff for dealing with dates and times, but here's one which does the job perfectly.
Usage is straightforward: pass in a number of seconds, and you'll get a string back along the lines of "1:01:23". If you want a leading zero for less than 10 hours ("01:01:23" in our example), call the function with the second parameter set to true.
<?php
function sec2hms ($sec, $padHours = false)
{
// start with a blank string
$hms = "";
// do the hours first: there are 3600 seconds in an hour, so if we divide
// the total number of seconds by 3600 and throw away the remainder, we're
// left with the number of hours in those seconds
$hours = intval(intval($sec) / 3600);
// add hours to $hms (with a leading 0 if asked for)
$hms .= ($padHours)
? str_pad($hours, 2, "0", STR_PAD_LEFT). ":"
: $hours. ":";
// dividing the total seconds by 60 will give us the number of minutes
// in total, but we're interested in *minutes past the hour* and to get
// this, we have to divide by 60 again and then use the remainder
$minutes = intval(($sec / 60) % 60);
// add minutes to $hms (with a leading 0 if needed)
$hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT). ":";
// seconds past the minute are found by dividing the total number of seconds
// by 60 and using the remainder
$seconds = intval($sec % 60);
// add seconds to $hms (with a leading 0 if needed)
$hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT);
// done!
return $hms;
}
?>
Questions? Suggestions for improvement? Feel free to get in touch.