-
-
Save shunchu/3175001 to your computer and use it in GitHub Desktop.
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 |
I have used the solutions of @springerigor and @NayanaBhagat to make it a bit more readable / understandable than a cryptic oneliner. It also removes decimals by using rounding.
# Will take as input a time in seconds (which is typically a result after subtracting two Time objects),
# and return the result in HH:MM:SS, even if it exceeds a 24 hour period.
def formatted_duration(total_seconds)
total_seconds = total_seconds.round # to avoid fractional seconds potentially compounding and messing up seconds, minutes and hours
hours = total_seconds / (60*60)
minutes = (total_seconds / 60) % 60 # the modulo operator (%) gives the remainder when leftside is divided by rightside. Ex: 121 % 60 = 1
seconds = total_seconds % 60
[hours, minutes, seconds].map do |t|
# Right justify and pad with 0 until length is 2.
# So if the duration of any of the time components is 0, then it will display as 00
t.round.to_s.rjust(2,'0')
end.join(':')
end
Updated: Added the initial total_seconds.round
to fix the bug with fractional seconds, after @dblock commented on Jun 26, 2018, which brought it to attention (thanks).
I will try to keep my most updated version here, for the future: https://gist.github.com/redbar0n/2eb154b8381994b2c55301bd37f57c1f
+1
+1
+1
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.
+1
👍
+1
+1
+1
+1
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
👍
This is pretty cool!
👍
Solid!
Thanks, really good 😄
+1
+1
+1
@joshuapinter, nice code, but I'm not the Magne that contributed it to SO.
+1
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
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"
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
☑️
+1
nice!!!
+1