Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save shunchu/3175001 to your computer and use it in GitHub Desktop.
Save shunchu/3175001 to your computer and use it in GitHub Desktop.
Convert seconds into HH:MM:SS in Ruby
t = 236 # seconds
Time.at(t).utc.strftime("%H:%M:%S")
=> "00:03:56"
# Reference
# http://stackoverflow.com/questions/3963930/ruby-rails-how-to-convert-seconds-to-time
@iGEL
Copy link

iGEL commented Mar 6, 2018

If you want to have output like 1h 30m:

def seconds_to_str(seconds)
  ["#{seconds / 3600}h", "#{seconds / 60 % 60}m", "#{seconds % 60}s"]
    .select { |str| str =~ /[1-9]/ }.join(" ")
end

seconds_to_str(2) # => "2s"
seconds_to_str(69) # => "1m 9s"
seconds_to_str(600) # => "10m"*
seconds_to_str(43_200) #=> "12h"
seconds_to_str(43_205) # => "12h 5s" <- no minutes!
seconds_to_str(100_000) # => "27h 46m 40s" <- you could adjust it for days etc.

@ardinusawan
Copy link

+1

@joerzepiejewski
Copy link

👍

@dblock
Copy link

dblock commented Jun 26, 2018

Beware of round being used here. If total seconds is 479.8282647584973

  • @redbar0n code produces the wrong result, "00:08:60"
  • @lonny code and the original Time.at version round down, so "00:07:59", but this is not the best approximation

Related and working:

@zalivanvitaly
Copy link

+1

@eliasdouglas
Copy link

+1

@dhurba87
Copy link

+1

@YoshitsuguFujii
Copy link

+1

@alexwebgr
Copy link

alexwebgr commented Apr 3, 2019

Added days!
extending on @springerigor solution

    def formatted_duration(total_seconds)
      days = total_seconds / (60 * 60 * 24)
      hours = total_seconds / (60 * 60)
      hours -= 24 if days > 0
      minutes = (total_seconds / 60) % 60
      seconds = total_seconds % 60

      "#{days}d #{hours}h #{minutes}m #{seconds}s"
    end

@PoombavaiS
Copy link

👍

Copy link

ghost commented Jul 15, 2019

This is pretty cool!

@itssomething
Copy link

👍

@pmichaeljones
Copy link

Solid!

@hdchinh
Copy link

hdchinh commented Mar 31, 2020

Thanks, really good 😄

@trangtungn
Copy link

+1

@tthuydang
Copy link

+1

@vilusa
Copy link

vilusa commented Oct 16, 2020

+1

@magne
Copy link

magne commented Dec 6, 2020

@joshuapinter, nice code, but I'm not the Magne that contributed it to SO.

@nfumiya
Copy link

nfumiya commented Jan 21, 2021

+1

@gabrielrb
Copy link

Nice! I also needed days, so thanks @alexwebgr
Just a small change, in case it's more than 48 hours

def formatted_duration(total_seconds)
    days = total_seconds / (60 * 60 * 24)
    hours = total_seconds / (60 * 60)
    hours -= (24 * days) if days >= 1
    minutes = (total_seconds / 60) % 60
    seconds = total_seconds % 60

    "#{days}d #{hours}h #{minutes}min #{seconds}s"
end

Copy link

ghost commented Mar 1, 2021

You can also use %T, it's a combination shortcut to get 24-hour time (%H:%M:%S)

Time.at(624).gmtime.strftime('%T')
=> "00:10:24"

@shilovk
Copy link

shilovk commented Jun 24, 2021

  def formatted_duration(total_seconds)
    days = (total_seconds / (60 * 60 * 24)).to_i
    hours = ((total_seconds / (60 * 60)) % 60).to_i
    minutes = ((total_seconds / 60) % 60).to_i
    seconds = (total_seconds % 60).to_i

    "#{days} d. #{hours} h. #{minutes} m. #{seconds} s."
  end

@aarkerio
Copy link

aarkerio commented Jul 8, 2021

☑️

@hidehiro98
Copy link

+1

@bryanalonso1993
Copy link

nice!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment