将字符串的持续时间转换为秒

时间:2014-11-26 12:41:54

标签: ruby

我需要将持续时间转换为秒。我如何在红宝石中做到这一点?我正在获取字符串

  

1小时10分钟

我需要将其转换为秒,即1*60*60 + 10*60 = 4200 seconds

在ruby中有任何功能吗?或者我是否需要使用常规表达并提取两者并将小时转换为秒,将转换为秒。什么是实现它的最佳方式。

4 个答案:

答案 0 :(得分:5)

使用Chronic Duration,例如,

irb> require "chronic_duration"
irb> ChronicDuration.parse("1hr 10min")
=> 4200

这也让你走另一条路,处理各种各样的输入等。

irb > ChronicDuration.output(4200)
=> "1 hr 10 mins"
irb > ChronicDuration.output(4200, format: :short)
=> "1h 10m"
irb > ChronicDuration.output(1299600)
=> "15 days 1 hr"
irb > ChronicDuration.output(1299600, weeks: true)
=> "2 wks 1 day 1 hr"

答案 1 :(得分:0)

我不知道是否有一个lib来做这个,但你可以这样做:

h = "1hr 10min".split(" ")[0].split("hr")[0].to_i*60*60 # => 3600
m = "1hr 10min".split(" ")[1].split("min")[0].to_i*60   # => 600
h+m #=> 4200

但也许有更好的方法。

答案 2 :(得分:0)

创建自己的功能:

def time_to_duration(t)
    r = %r{^(\d+)hr (\d+)min}
    t.match(r)
    return $1.to_i*60*60 + $2.to_i*60
end

d = '1hr 10min'
time_to_duration(d)

#=> 4200

答案 3 :(得分:0)

以下方法将处理2hr1hr 20min1hr 10min 5sec20min 5sec

names = {'hr'=>3600,'min'=>60}

'1hr 10min'.scan(/(\d+)\s*(\w+)/).reduce(0) { |memo, val| 
  memo += (names[val[1]] || 1) * val[0].to_i 
}.last
#⇒ 4200

'1hr 5sec'.scan(/(\d+)\s*(\w+)/).reduce(0) { |memo, val| 
  memo += (names[val[1]] || 1) * val[0].to_i 
}.last
#⇒ 3605

希望它有所帮助。