Rails - 将持续时间转换为整数

时间:2013-12-28 19:38:06

标签: ruby-on-rails ruby ruby-on-rails-3

我需要以持续时间为条件运行轨道。

持续时间的格式如下(演示时间超过14秒):

duration = "00:00:14.01"

我想知道如何将上述持续时间转换为整数,所以我可以编写如下条件:

if duration > 45
    raise "This video is longer than 45 seconds!"
end

6 个答案:

答案 0 :(得分:3)

duration是字符串吗?

如果是这样,你可以选择:

seconds = duration.split(':').reverse.map.with_index.sum do |m, i| 
  m.to_f * 60 ** i
end

:))

答案 1 :(得分:3)

您可以按如下方式计算秒数:

require 'time'

t = Time.parse("00:00:14.01")
sec = t.hour*3600 + t.min*60 + t.sec
sec # => 14

此处的重要方法设置为 - Time#hourTime#minTime#sec

正如 @ChrisHeald 建议的那样 -

 t = Time.parse("00:00:14.01") - Time.parse("00:00:00")

答案 2 :(得分:0)

做类似

的事情
duration.scan(/\d\d/).map(&:to_i).inject{|s, r| r + s * 60} / 60

会在几秒钟内给你时间

答案 3 :(得分:0)

如果您从名为duration的变量中存储的持续时间的字符串版本开始,那么:

duration =~ /(\d\d):(\d\d):(\d\d.*)/
hours = $1.to_i
minutes = $2.to_i
seconds = $1.to_f.round

然后按时间数学将其转换为公共单位进行显示等。

答案 4 :(得分:0)

您必须将某种类型的转换写入float,因此您可以将其与整数或浮点数进行比较。

当我感到无聊时会发生这种情况......并且太喜欢Ruby了。

def duration_to_float(string)
  items = string.split(':').reverse
  ret = items.shift.to_f
  items.each_with_index do |item, index|
    ret += item.to_i * 60 ** (index + 1)
  end
  ret
end

puts duration_to_float('00:00:14.06')
puts duration_to_float('00:01:14.06')
puts duration_to_float('01:00:14.06')

输出:

14.06
74.06
3614.06

作为一个额外的优势,你可以传入几分钟或几秒钟,但它必须是一个字符串。例如,“14.06”或“00:14.06”与第一个例子相同。

答案 5 :(得分:0)

您可以使用strptime

require 'time'
seconds = Time.strptime(duration, "%H:%M:%S") - Time.strptime("00:00:00", "%H:%M:%S") #=> 21
seconds.to_i

你得到相对于一天开始的时间,所以我减去它以获得持续时间(以秒为单位)。