将持续时间转换为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项目的持续时间:

  1. 将一个自定义方法添加到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 
  2. 在项目的任何地方调用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