将持续时间转换为Rails 3或Ruby中的小时:分钟:秒(或类似)
我有一种感觉,有一个简单的/内置的方式来做到这一点,但我找不到它。
我有一个整数持续时间(秒),我想以友好的格式显示它。
例如3600将显示为“01:00:00”或“1小时”或其他东西。
我可以用time_ago_in_words(Time.zone.now+3600)
来做,但是感觉有点像黑客,没有理由为了格式化这个值而从当前时间加/减。 有没有duration_in_words()
什么的?
谢谢
请参阅: http : //api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
distance_of_time_in_words(3600) => "about 1 hour"
加起来:
假设total_seconds = 3600
选项1:
distance_of_time_in_words(total_seconds) #=> "about 1 hour"
选项2:
Time.at(total_seconds).utc.strftime("%H:%M:%S") #=> "01:00:00"
备选案文3:
seconds = total_seconds % 60 minutes = (total_seconds / 60) % 60 hours = total_seconds / (60 * 60) format("%02d:%02d:%02d", hours, minutes, seconds) #=> "01:00:00"
如果你想要的话可以使用Option1 ,如果你想要H:M:S格式的话可以使用Option2 ,如果你想使用H:M:S格式的话可以使用Option3 ,并且可以有24小时以上
Ruby的string%
运算符太不受重视,并且被遗忘。
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
给定t是以秒为单位的持续时间,这将发出一个零填充冒号分隔的string,包括天。 例:
t = 123456 "%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60] => "01:10:17:36"
可爱。
我想你也可以这样做:
(Time.mktime(0)+3600).strftime("%H:%M:%S")
按照你的意愿格式化。
顺便说一句,原来我想到使用Time.at(),但似乎我的Ubuntu的EPOCH时间是星期四01 01:00:00 +0100 1970年,而不是00:00:00小时,因此,如果我这样做:
Time.at(3600).strftime("%H:%M:%S")
给我比想要的多1小时。
我用这个来显示我的Rails项目的持续时间:
-
将一个自定义方法添加到
Integer
类。 您可以在initializers
文件夹中创build一个名为pretty_duration.rb
的新文件:class Integer def pretty_duration parse_string = if self < 3600 '%M:%S' else '%H:%M:%S' end Time.at(self).utc.strftime(parse_string) end end
-
在项目的任何地方调用
seconds.pretty_duration
:275.pretty_duration # => "04:35" 9823.pretty_duration # => "02:43:43"
这个答案build立在Lev Lukomsky的守则上
请注意持续时间超过一天。
(timing/3600).to_i.to_s.rjust(2,'0') + ":"+Time.at(timing).utc.strftime("%M:%S")
使用Time.utc.strftime
仅适用于总小时数小于24的值 :
2.2.2 :004 > Time.at(60 * 60).utc.strftime('%H h %M m') => "01 h 00 m"
对于更大的值它返回不正确的结果:
2.2.2 :006 > Time.at(60 * 60 * 24).utc.strftime('%H h %M m') => "00 h 00 m"
我build议使用我发现这个问题最简单的方法:
def formatted_duration total_seconds hours = total_seconds / (60 * 60) minutes = (total_seconds / 60) % 60 seconds = total_seconds % 60 "#{ hours } h #{ minutes } m #{ seconds } s" end
您随时可以根据需要调整返回的值。
这个使用隐蔽的divmod
方法同时进行分和模,所以它正确地处理了Float
秒:
def duration(seconds) minutes, seconds = seconds.divmod(60) hours, minutes = minutes.divmod(60) days, hours = hours.divmod(24) "#{days.to_s.rjust(3)}d #{hours.to_s.rjust(2)}h #{minutes.to_s.rjust(2)}m #{seconds}s" end