Answers:
请参阅:http : //api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
distance_of_time_in_words(3600)
=> "about 1 hour"
distance_of_time_in_words
,您可以通过vague: true
作为选项传递舍入的数字。
加起来:
假如说 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小时
01:00:00
。
Ruby的字符串%
运算符太过被人们所理解和忘记了。
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
给定t是一个持续时间(以秒为单位),它将发出一个零填充的冒号分隔的字符串(包括天)。例:
t = 123456
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
=> "01:10:17:36"
可爱。
%
说:“从我的右边获取参数数组,并将其插入到我的左边的格式字符串中。” 在这方面,它printf
更简洁地类似于C \ C ++,并且可以在分配中使用。是的,我称之为可爱。而且功能强大。有一些例子可以更好地证明这种口才,但是他们不能回答这个问题。顺便说一句,您的蛇ark不被感激。
我想您也可以执行以下操作:
(Time.mktime(0)+3600).strftime("%H:%M:%S")
格式化它,如你所愿。
顺便说一句,最初我想使用Time.at(),但是在我的Ubuntu上,EPOCH时间是Thu Jan 01 01:00:00 +0100 1970,而不是我期望的00:00:00小时,因此如果我这样做:
Time.at(3600).strftime("%H:%M:%S")
给我比希望多1小时的时间。
将自定义方法添加到Integer
类。您可以pretty_duration.rb
在initializers
文件夹中创建一个名为的新文件:
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"
这个答案建立在列夫·卢科姆斯基的密码上
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"
我建议使用我发现的最简单的方法来解决此问题:
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
您始终可以根据需要调整返回值。
列夫·卢科姆斯基(Lev Lukomsky)利用ActiveSupport :: Duration并处理毫秒(对基准代码有用)得出的答案
# duration in ms modulus number of ms in one second
milliseconds = duration.in_milliseconds % 1.second.in_milliseconds
# duration in seconds modulus number of seconds in one minute
seconds = (duration / 1.second) % (1.minute / 1.second)
# duration in minutes modulus number of minutes in one hour
minutes = (duration / 1.minute) % (1.hour / 1.minute)
# duration in hours modulus number of hours in one day
hours = (duration / 1.hour) % (1.day / 1.hour)
format("%02d:%02d:%02d:%03d", hours, minutes, seconds, milliseconds) #=> "12:05:00:001"
当然,您可以使用相关的ActiveSupport方法并重复相同的结构,轻松地将其扩展为几天,几个月,几年等。
请记住,由于持续时间太长,这可能是不准确的,因为1个月的持续时间不是固定的天数,而且我不确定AS:Duration如何处理该时间。
向@joshuapinter喊出最好的答案(以评论的形式)。
使用嵌入式替换dotiw
gem可以更好地控制输出的精度,以满足不同的需求:
https://github.com/radar/distance_of_time_in_words
示例查看代码:
%label
Logoff after:
- expire_in = distance_of_time_in_words(Time.now, Time.now + user.custom_timeout.minutes, :only => [:minutes, :hours, :days])
= expire_in
结果是这样的:
Logoff after: 1 day, 13 hours, and 20 minutes
hours = 3.5456
value = (hours*60).divmod(60).map{ |a| "%02d"%[a.floor] }.join(":")
=> "03:32"