我需要将持续时间转换为秒。我如何在红宝石中做到这一点?我正在获取字符串
1小时10分钟
我需要将其转换为秒,即1*60*60 + 10*60 = 4200 seconds
在ruby中有任何功能吗?或者我是否需要使用常规表达并提取两者并将小时转换为秒,将转换为秒。什么是实现它的最佳方式。
答案 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)
以下方法将处理2hr
,1hr 20min
,1hr 10min 5sec
,20min 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
希望它有所帮助。