392

I need to convert seconds to "Hour:Minute:Second".

For example: "685" converted to "00:11:25"

How can I achieve this?

Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
EzzDev
  • 9,900
  • 12
  • 35
  • 35

30 Answers30

848

You can use the gmdate() function:

echo gmdate("H:i:s", 685);
animuson
  • 53,861
  • 28
  • 137
  • 147
  • 192
    Better make sure the number of seconds is below 86,400 though. – salathe Jul 03 '10 at 19:15
  • A little trick I just used was this: $recording_length = explode(":", gmdate("H:i:s", $recording_length)) - Creates an array where element 0 is the hour, 1=minute & 2=sec. – Lee Loftiss Jan 20 '13 at 06:24
  • Could someone please explain, why it is working with `gmdate()` and why the amount of seconds has to be under a day? – Alexxus Jun 14 '13 at 07:30
  • 16
    H represents the amount of hours in a single day. So if you have 90000 seconds and you'll use H on it the result will be 01 (first hour of a next day). NOT 25 - there are only 24 hours in a day. – MarcinWolny Jun 20 '13 at 10:35
  • 7
    I'm not sure this is the right answer, this will produce a `datetime` ... so if we expect result > 24 hours it will not work. Also if we need some negative result ( for example working with offset ) it will not work. `-1` for the lark of details – WonderLand Jul 01 '14 at 11:38
  • 65
    This shouldn't be the accepted answer due to the obvious flaw for times that are greater than 24 hours. – Scott Flack Sep 03 '14 at 05:23
  • 1
    And how to do if we want millisecond ? – Zagloo Apr 01 '15 at 15:00
  • If you were to actually dump out a fully formatted uk date instead of just hours minutes and seconds then you would soon realise that the date resulting is the epoch date +/- the numbers that are fed into it in seconds. In the posters example that would be 685 seconds after the epoch date. 00-00-00 00:11:25. This may throw your date calculations out if you do not take that into consideration and reuse a result. – CodingInTheUK Apr 09 '15 at 17:03
  • This is a hackey way of doing it – Antony D'Andrea Jan 26 '16 at 14:12
  • 1
    If this solution won't work for you because you have more than 86400 seconds (1 day), check out @RaDim's solution. It is very similar, but it intelligently handles the number of hours. – Eric Seastrand Mar 08 '16 at 17:43
  • in this case there is no reason to use `gmdate()` instead of `date()` since no "real" date/time is represented. – low_rents Apr 27 '16 at 07:11
  • 10
    For use with days when numbers might be bigger than 85399 you can use `echo gmdate("z H:i:s", 685);` z is the amount of days in the year starting with 0. You can obviously review the php date manual to cater to your specific needs. – Nightwolf Aug 11 '16 at 06:51
  • for all those that are complaining about not working with seconds over 86400 (one day), just switch out the `H:i:s` with `d:H:i:s` – Joe Black Jun 13 '17 at 18:33
  • ok, took me longer than 5 minutes to realize that you also have to substract 86400 from your seconds whenever you use the `d:H:i:s` format to get the correct days count – Joe Black Jun 13 '17 at 18:52
  • nobody here wants days.. we want something like 510:44:12 ... – Jaxx0rr Feb 04 '20 at 23:19
  • If your seconds is more then 86399 then its not working at all Pelase check this for both cases https://stackoverflow.com/questions/3534533/output-is-in-seconds-convert-to-hhmmss-format-in-php/60844796#60844796 – Mannu saraswat Mar 04 '21 at 12:02
  • what about milliseconds? – Dr. House Aug 04 '22 at 20:14
199

One hour is 3600sec, one minute is 60sec so why not:

<?php

$init = 685;
$hours = floor($init / 3600);
$minutes = floor(($init / 60) % 60);
$seconds = $init % 60;

echo "$hours:$minutes:$seconds";

?>

which produces:

$ php file.php
0:11:25

(I've not tested this much, so there might be errors with floor or so)

Aif
  • 11,015
  • 1
  • 30
  • 44
  • But he wants two zeros... "00:11:25" not "0:11:25" – animuson Jul 03 '10 at 18:23
  • 64
    `printf("%02d:%02d:%02d", $hours, $minutes, $seconds);` – Amber Jul 03 '10 at 18:26
  • 10
    Good answer, but make sure you subtract $hours*3600 and $minutes*60 from $init in between each operation otherwise you'll end up double counting minutes and seconds. – Mike Stowe Jul 25 '15 at 05:07
  • 8
    To add to @Amber's comment, use `sprintf` to return the value instead of printing it. – Allen Butler Sep 19 '16 at 18:33
  • This one works best for me. One little thing to add. When you have less than 10 hours it shows 3:10:59. Make it look like the OP wants 03:10:59. Works like this $hours = floor( 2300 / 3600); return ($hours < 10 ? '0' . $hours : $hours) . gmdate(":i:s", $this->getSeconds() % 3600); – NME New Media Entertainment Apr 09 '21 at 21:56
93

here you go

function format_time($t,$f=':') // t = seconds, f = separator 
{
  return sprintf("%02d%s%02d%s%02d", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
}

echo format_time(685); // 00:11:25
nathan
  • 5,402
  • 1
  • 22
  • 18
  • 1
    Doesn't work for negative values. If you have negative seconds interval, use this: `return ($t< 0 ? '-' : '') . sprintf("%02d%s%02d%s%02d", floor(abs($t)/3600), $f, (abs($t)/60)%60, $f, abs($t)%60); }` – Ajax Nov 15 '13 at 10:25
74

Use function gmdate() only if seconds are less than 86400 (1 day) :

$seconds = 8525;
echo gmdate('H:i:s', $seconds);
# 02:22:05

See: gmdate()

Run the Demo


Convert seconds to format by 'foot' no limit* :

$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

See: floor(), sprintf(), arithmetic operators

Run the Demo


Example use of DateTime extension:

$seconds = 8525;
$zero    = new DateTime("@0");
$offset  = new DateTime("@$seconds");
$diff    = $zero->diff($offset);
echo sprintf("%02d:%02d:%02d", $diff->days * 24 + $diff->h, $diff->i, $diff->s);
# 02:22:05

See: DateTime::__construct(), DateTime::modify(), clone, sprintf()

Run the Demo


MySQL example range of the result is constrained to that of the TIME data type, which is from -838:59:59 to 838:59:59 :

SELECT SEC_TO_TIME(8525);
# 02:22:05

See: SEC_TO_TIME

Run the Demo


PostgreSQL example:

SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS');
# 02:22:05

Run the Demo

animuson
  • 53,861
  • 28
  • 137
  • 147
Glavić
  • 42,781
  • 13
  • 77
  • 107
43

Other solutions use gmdate, but fail in edge cases where you have more than 86400 seconds. To get around this, we can simply compute the number of hours ourselves, then let gmdate compute the remaining seconds into minutes/seconds.

echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);

Input: 6030 Output: 1:40:30

Input: 2000006030 Output: 555557:13:50

Manse
  • 37,765
  • 10
  • 83
  • 108
RaDim
  • 630
  • 6
  • 6
17
// TEST
// 1 Day 6 Hours 50 Minutes 31 Seconds ~ 111031 seconds

$time = 111031; // time duration in seconds

$days = floor($time / (60 * 60 * 24));
$time -= $days * (60 * 60 * 24);

$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);

$minutes = floor($time / 60);
$time -= $minutes * 60;

$seconds = floor($time);
$time -= $seconds;

echo "{$days}d {$hours}h {$minutes}m {$seconds}s"; // 1d 6h 50m 31s
Stano
  • 8,749
  • 6
  • 30
  • 44
mughal
  • 171
  • 1
  • 5
9

If you don't like accepted answer or popular ones, then try this one

function secondsToTime($seconds_time)
{
    if ($seconds_time < 24 * 60 * 60) {
        return gmdate('H:i:s', $seconds_time);
    } else {
        $hours = floor($seconds_time / 3600);
        $minutes = floor(($seconds_time - $hours * 3600) / 60);
        $seconds = floor($seconds_time - ($hours * 3600) - ($minutes * 60));
        return "$hours:$minutes:$seconds";
    }
}

secondsToTime(108620); // 30:10:20
Eranda
  • 868
  • 1
  • 10
  • 27
7

Here is a one liner that handles negative seconds and more than 1 day worth of seconds.

sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

For Example:

$seconds= -24*60*60 - 2*60*60 - 3*60 - 4; // minus 1 day 2 hours 3 minutes 4 seconds
echo sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

outputs: -26:03:04

Benjamin
  • 71
  • 1
  • 1
7
gmdate("H:i:s", no_of_seconds);

Will not give time in H:i:s format if no_of_seconds is greater than 1 day (seconds in a day).
It will neglect day value and give only Hour:Min:Seconds

For example:

gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42
ByteHamster
  • 4,884
  • 9
  • 38
  • 53
Vikash Kumar
  • 575
  • 5
  • 6
6

I have already explained this here pasting that answer here as well

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 than 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 ...

ManojKiran A
  • 5,896
  • 4
  • 30
  • 43
Mannu saraswat
  • 1,061
  • 8
  • 15
5

write function like this to return an array

function secondsToTime($seconds) {

  // extract hours
  $hours = floor($seconds / (60 * 60));

  // extract minutes
  $divisor_for_minutes = $seconds % (60 * 60);
  $minutes = floor($divisor_for_minutes / 60);

  // extract the remaining seconds
  $divisor_for_seconds = $divisor_for_minutes % 60;
  $seconds = ceil($divisor_for_seconds);

  // return the final array
  $obj = array(
      "h" => (int) $hours,
      "m" => (int) $minutes,
      "s" => (int) $seconds,
   );

  return $obj;
}

then simply call the function like this:

secondsToTime(100);

output is

Array ( [h] => 0 [m] => 1 [s] => 40 )
radiovisual
  • 6,298
  • 1
  • 26
  • 41
vamsikrishnamannem
  • 4,817
  • 5
  • 23
  • 34
4

See:

    /** 
     * Convert number of seconds into hours, minutes and seconds 
     * and return an array containing those values 
     * 
     * @param integer $inputSeconds Number of seconds to parse 
     * @return array 
     */ 

    function secondsToTime($inputSeconds) {

        $secondsInAMinute = 60;
        $secondsInAnHour  = 60 * $secondsInAMinute;
        $secondsInADay    = 24 * $secondsInAnHour;

        // extract days
        $days = floor($inputSeconds / $secondsInADay);

        // extract hours
        $hourSeconds = $inputSeconds % $secondsInADay;
        $hours = floor($hourSeconds / $secondsInAnHour);

        // extract minutes
        $minuteSeconds = $hourSeconds % $secondsInAnHour;
        $minutes = floor($minuteSeconds / $secondsInAMinute);

        // extract the remaining seconds
        $remainingSeconds = $minuteSeconds % $secondsInAMinute;
        $seconds = ceil($remainingSeconds);

        // return the final array
        $obj = array(
            'd' => (int) $days,
            'h' => (int) $hours,
            'm' => (int) $minutes,
            's' => (int) $seconds,
        );
        return $obj;
    }

From: Convert seconds into days, hours, minutes and seconds

Community
  • 1
  • 1
FooBar
  • 5,752
  • 10
  • 44
  • 93
4

This function my be useful, you could extend it:

function formatSeconds($seconds) {

if(!is_integer($seconds)) {
    return FALSE;
}

$fmt = "";

$days = floor($seconds / 86400);
if($days) {
    $fmt .= $days."D ";
    $seconds %= 86400;
}

$hours = floor($seconds / 3600);
if($hours) {
    $fmt .= str_pad($hours, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 3600;
}

$mins = floor($seconds / 60 );
if($mins) {
    $fmt .= str_pad($mins, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 60;
}

$fmt .= str_pad($seconds, 2, '0', STR_PAD_LEFT);

return $fmt;}
AMCoded
  • 1,374
  • 2
  • 24
  • 39
3

The gmtdate() function didn't work for me as I was tracking hours worked on a project and if it's over 24 hours, you get amount left over after 24 hours is subtracted. In other words 37 hours becomes 13 hours. (all as stated above by Glavic - thanks for your examples!) This one worked well:

Convert seconds to format by 'foot' no limit :
$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05
TotalPro
  • 31
  • 2
3

Try this:

date("H:i:s",-57600 + 685);

Taken from
http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss

Kerry Jones
  • 21,806
  • 12
  • 62
  • 89
  • Not entirely sure, but I'm pretty sure it's setting the time to 0 and then anything on top of that would simply be the correct answer – Kerry Jones Feb 03 '12 at 00:35
  • This puts leading 0's in front of the minutes, which you can't adjust with date() - http://ca.php.net/manual/en/function.date.php – barfoon Jun 24 '12 at 03:41
  • @barfoon -- true, but I believe this is what M.Ezz was asking for, and it is a standard used in time. This looks strange from my experience "3:7:5" instead of "03:07:05", or even "3:7", looks more like a ratio to me. – Kerry Jones Jun 25 '12 at 17:08
2

Solution from: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

This code avoids the tedious function calls and piece-by-piece string-building as much as possible, and the big and bulky functions people are making for this.

It returns an output in the format "1h05m00s" and uses leading zeroes for minutes and seconds, as long as another non-zero time component precedes them.

It also skips all empty leading components to avoid giving you useless info like "0h00m01s" (instead that will show up as "1s").

Example results: "1s", "1m00s", "19m08s", "1h00m00s", "4h08m39s".

$duration = 1; // values 0 and higher are supported!
$converted = [
    'hours' => floor( $duration / 3600 ),
    'minutes' => floor( ( $duration / 60 ) % 60 ),
    'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }

If you want to make the code even shorter (but less readable), you can avoid the $converted array and instead put the values directly in the sprintf() call, as follows:

$duration = 1; // values 0 and higher are supported!
$result = ltrim( sprintf( '%02dh%02dm%02ds', floor( $duration / 3600 ), floor( ( $duration / 60 ) % 60 ), ( $duration % 60 ) ), '0hm' );
if( $result == 's' ) { $result = '0s'; }

Duration must be 0 or higher in both of the code pieces above. Negative durations are not supported. But you can handle negative durations by using the following alternative code instead:

$duration = -493; // negative values are supported!
$wasNegative = FALSE;
if( $duration < 0 ) { $wasNegative = TRUE; $duration = abs( $duration ); }
$converted = [
    'hours' => floor( $duration / 3600 ),
    'minutes' => floor( ( $duration / 60 ) % 60 ),
    'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }
if( $wasNegative ) { $result = "-{$result}"; }
// $result is now "-8m13s"
2

Not sure why this hasn't been proposed yet, but here's a variation using DateInterval, which has the advantage that seconds > 86400 are not a problem (just don't expect the hours to be < 24)

noteable: the function returns the DateInterval object, so output format is up to the caller

function seconds2interval($seconds) {
    $s = intval($seconds);
    $hrs = floor($s / 3600);
    $min = floor(($s - ($hrs * 3600)) / 60);
    $sec = $s % 60;
    
    $duration = sprintf('PT%dH%dM%dS', $hrs, $min, $sec);
    $d = new DateInterval($duration);
    
    return $d;
}

$d = seconds2interval(93837.3113);  
echo $d->format('%H:%I:%s'); // 26:03:57
Honk der Hase
  • 2,459
  • 1
  • 14
  • 26
2

Just another method, with arithmetic operator Modulo (%). Easy read and understanding.

function readableSeconds($seconds)
{
    $days = intdiv($seconds, 86400);
    $hours = intdiv(($seconds % 86400), 3600);
    $minutes = intdiv(($seconds % 3600), 60);
    $seconds = $seconds % 60;
    
    return ltrim(sprintf('%dd %dh %dm %ds', $days, $hours, $minutes, $seconds), ' 0dhm');
}

Output example: 1d 1h 8m 20s

Victor Volpe
  • 101
  • 9
  • What do you mean, "another"? The arithmetic operator Modulo (%) is used in half the answers on this page. All using the exactly the same calculations. Are you sure this page needs another answer? – Your Common Sense Feb 14 '23 at 05:37
  • Using trim with custom characters is anything but "easy read". But smart way of leaving out zero values. but again, your answer is not the first using it. I don't see anything new here – Your Common Sense Feb 14 '23 at 05:41
  • @YourCommonSense `if (nobody_asked_you_nothing) continue;` – Victor Volpe Feb 15 '23 at 06:13
1

A simple way to use DateTime for this is:

    $time = 60; //sec.
    $now = time();
    $rep = new DateTime('@'.$now);
    $diff = new DateTime('@'.($now+$time));
    $return = $diff->diff($rep)->format($format);

    //output:  01:04:65

It's a simple solution wich gives you the ability to use the format Method of DateTime.

predkony
  • 101
  • 3
1

If you want to create a audio/video duration string like YouTube, etc. you can do:

($seconds >= 60) ? ltrim(gmdate("H:i:s", $seconds), ":0") : gmdate("0:s", $seconds)

Will return strings like:

55.55 => '0:55'
100   => '1:40'

Probably won't work well for time >= 24 hours.

Keith Turkowski
  • 751
  • 7
  • 11
0
function timeToSecond($time){
    $time_parts=explode(":",$time);
    $seconds= ($time_parts[0]*86400) + ($time_parts[1]*3600) + ($time_parts[2]*60) + $time_parts[3] ; 
    return $seconds;
}

function secondToTime($time){
    $seconds  = $time % 60;
    $seconds<10 ? "0".$seconds : $seconds;
    if($seconds<10) {
        $seconds="0".$seconds;
    }
    $time     = ($time - $seconds) / 60;
    $minutes  = $time % 60;
    if($minutes<10) {
        $minutes="0".$minutes;
    }
    $time     = ($time - $minutes) / 60;
    $hours    = $time % 24;
    if($hours<10) {
        $hours="0".$hours;
    }
    $days     = ($time - $hours) / 24;
    if($days<10) {
        $days="0".$days;
    }

    $time_arr = array($days,$hours,$minutes,$seconds);
    return implode(":",$time_arr);
}
anu g prem
  • 545
  • 5
  • 15
0

Well I needed something that would reduce seconds into hours minutes and seconds, but would exceed 24 hours, and not reduce further down into days.

Here is a simple function that works. You can probably improve it... But here it is:

function formatSeconds($seconds)
{
    $hours = 0;$minutes = 0;
    while($seconds >= 60){$seconds -= 60;$minutes++;}
    while($minutes >= 60){$minutes -=60;$hours++;}
    $hours = str_pad($hours, 2, '0', STR_PAD_LEFT);
    $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT);
    $seconds = str_pad($seconds, 2, '0', STR_PAD_LEFT);
    return $hours.":".$minutes.":".$seconds;
}
Paul Ishak
  • 1,093
  • 14
  • 19
0
$given = 685;

 /*
 * In case $given == 86400, gmdate( "H" ) will convert it into '00' i.e. midnight.
 * We would need to take this into consideration, and so we will first
 * check the ratio of the seconds i.e. $given:$number_of_sec_in_a_day
 * and then after multiplying it by the number of hours in a day (24), we
 * will just use "floor" to get the number of hours as the rest would
 * be the minutes and seconds anyways.
 *
 * We can also have minutes and seconds combined in one variable,
 * e.g. $min_sec = gmdate( "i:s", $given );
 * But for versatility sake, I have taken them separately.
 */

$hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

$min = gmdate( "i", $given );

$sec = gmdate( "s", $given );

echo $formatted_string = $hours.':'.$min.':'.$sec;

To convert it into a function:

function getHoursFormat( $given ){

 $hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

 $min = gmdate( "i", $given );

 $sec = gmdate( "s", $given );

 $formatted_string = $hours.':'.$min.':'.$sec;

 return $formatted_string;

}
Brajinder Singh
  • 159
  • 3
  • 8
0

In java you can use this way.

   private String getHmaa(long seconds) {
    String string;
    int hours = (int) seconds / 3600;
    int remainder = (int) seconds - hours * 3600;
    int mins = remainder / 60;
    //remainder = remainder - mins * 60;
    //int secs = remainder;

    if (hours < 12 && hours > 0) {
        if (mins < 10) {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    } else if (hours >= 12) {
        if (mins < 10) {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? "0" + mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        } else {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        }
    } else {
        if (mins < 10) {
            string = String.valueOf("0" + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf("0" + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    }
    return string;
}
0

If you need to do that in javascript, you can do it in just one line of code as answered here Convert seconds to HH-MM-SS with JavaScript. Replace SECONDS with what you want to convert.

var time = new Date(SECONDS * 1000).toISOString().substr(11, 8);
icynets
  • 337
  • 2
  • 5
0

This is a pretty way to do that:

function time_converter($sec_time, $format='h:m:s'){
      $hour = intval($sec_time / 3600) >= 10 ? intval($sec_time / 3600) : '0'.intval($sec_time / 3600);
      $minute = intval(($sec_time % 3600) / 60) >= 10 ? intval(($sec_time % 3600) / 60) : '0'.intval(($sec_time % 3600) / 60);
      $sec = intval(($sec_time % 3600) % 60)  >= 10 ? intval(($sec_time % 3600) % 60) : '0'.intval(($sec_time % 3600) % 60);

      $format = str_replace('h', $hour, $format);
      $format = str_replace('m', $minute, $format);
      $format = str_replace('s', $sec, $format);

      return $format;
    }
iamousseni
  • 130
  • 1
  • 5
0

The following codes can display total hours plus minutes and seconds accurately

$duration_in_seconds = 86401;
if($duration_in_seconds>0)
{
    echo floor($duration_in_seconds/3600).gmdate(":i:s", $duration_in_seconds%3600);
}
else
{
    echo "00:00:00";
}
Pamira
  • 129
  • 7
  • Code only answers are discouraged on SO. Phase add an explanation for long term value. Future visitors should be able to learn from your answer to and supply that knowledge to their own issues. They are also considered better quality (good for the platform), and are more likely to be upvoted. Please consider editing to add context or highlight important bits. Please consider this in future answers. Finally, some questions don't meet SO guidelines, & shouldn't be answered. Duplicate questions should instead be redirected via comments or by closing with a reference to the already asked question – SherylHohman Jul 26 '20 at 05:58
-1

Just in case anyone else is looking for a simple function to return this nicely formatted (I know it is not the format the OP asked for), this is what I've just come up with. Thanks to @mughal for the code this was based on.

function format_timer_result($time_in_seconds){
    $time_in_seconds = ceil($time_in_seconds);

    // Check for 0
    if ($time_in_seconds == 0){
        return 'Less than a second';
    }

    // Days
    $days = floor($time_in_seconds / (60 * 60 * 24));
    $time_in_seconds -= $days * (60 * 60 * 24);

    // Hours
    $hours = floor($time_in_seconds / (60 * 60));
    $time_in_seconds -= $hours * (60 * 60);

    // Minutes
    $minutes = floor($time_in_seconds / 60);
    $time_in_seconds -= $minutes * 60;

    // Seconds
    $seconds = floor($time_in_seconds);

    // Format for return
    $return = '';
    if ($days > 0){
        $return .= $days . ' day' . ($days == 1 ? '' : 's'). ' ';
    }
    if ($hours > 0){
        $return .= $hours . ' hour' . ($hours == 1 ? '' : 's') . ' ';
    }
    if ($minutes > 0){
        $return .= $minutes . ' minute' . ($minutes == 1 ? '' : 's') . ' ';
    }
    if ($seconds > 0){
        $return .= $seconds . ' second' . ($seconds == 1 ? '' : 's') . ' ';
    }
    $return = trim($return);

    return $return;
}
Luke Cousins
  • 2,068
  • 1
  • 20
  • 38
-1

Anyone whose looking for this in the future, this gives the format the initial poster asked for.

$init = 685;
$hours = floor($init / 3600);
$hrlength=strlen($hours);
if ($hrlength==1) {$hrs="0".$hours;}
else {$hrs=$hours;} 

$minutes = floor(($init / 60) % 60);
$minlength=strlen($minutes);
if ($minlength==1) {$mins="0".$minutes;}
else {$mins=$minutes;} 

$seconds = $init % 60;
$seclength=strlen($seconds);
if ($seclength==1) {$secs="0".$seconds;}
else {$secs=$seconds;} 

echo "$hrs:$mins:$secs";
Gordon
  • 11
-3
<?php
$time=3*3600 + 30*60;


$year=floor($time/(365*24*60*60));
$time-=$year*(365*24*60*60);

$month=floor($time/(30*24*60*60));
$time-=$month*(30*24*60*60);

$day=floor($time/(24*60*60));
$time-=$day*(24*60*60);

$hour=floor($time/(60*60));
$time-=$hour*(60*60);

$minute=floor($time/(60));
$time-=$minute*(60);

$second=floor($time);
$time-=$second;
if($year>0){
    echo $year." year, ";
}
if($month>0){
    echo $month." month, ";
}
if($day>0){
    echo $day." day, ";
}
if($hour>0){
    echo $hour." hour, ";
}
if($minute>0){
    echo $minute." minute, ";
}
if($second>0){
    echo $second." second, ";
}
Ibrahim Akbar
  • 119
  • 1
  • 8