所以,我有一串时间......就像
那样'4 hours'
'48 hours'
'3 days'
'15 minutes'
我想将这些转换为秒。对于'4 hours'
,这很好用
Time.parse('4 hours').to_i - Time.parse('0 hours').to_i
=> 14400 # 4 hours in seconds, yay
但是,这在48小时内无效(超出范围错误)。它也不能工作3天(没有信息错误)等。
有没有一种简单的方法可以将这些字符串转换为秒?
答案 0 :(得分:6)
你问Ruby与Time.parse的关系是确定一天中的某个时间。那不是你想要的。我能想到的所有库在这方面都是相似的:他们对绝对时间感兴趣,而不是时间长度。
要将字符串转换为我们可以使用的时间格式,我建议使用Chronic(gem install chronic
)。要转换为秒,我们可以执行与当前时间相关的所有操作,然后根据需要减去该时间以获得绝对秒数。
def seconds_in(time)
now = Time.now
Chronic.parse("#{time} from now", :now => now) - now
end
seconds_in '48 hours' # => 172,800.0
seconds_in '15 minutes' # => 900.0
seconds_in 'a lifetime' # NoMethodError, not 42 ;)
一些简短的说明:
from now
是需要慢性病的原因 - 它处理自然语言输入。now
是安全的,因为Time.now会从Chronic做出魔法的时间和从结果中减去它的时间发生变化。它可能永远不会发生,但我认为这比对不起更安全。答案 1 :(得分:3)
4.hours => 14400 seconds
4.hours.to_i 14400
4.hours - 0.hours => 14400 seconds
def string_to_seconds string
string.split(' ')[0].to_i.send(string.split(' ')[1]).to_i
end
此辅助方法仅在时间格式为[空格]小时/分钟/秒(s)时才有效
答案 2 :(得分:3)
'48 hours'.match(/^(\d+) (minutes|hours|days)$/) ? $1.to_i.send($2) : 'Unknown'
=> 172800 seconds
答案 3 :(得分:1)
我相信你会从chronic gem中获得一些好的工作。
答案 4 :(得分:0)
慢性病会起作用,但慢性病持续时间更合适。 它可以解析一个字符串并给你几秒钟。
ChronicDuration ::解析(' 15分钟') 要么 ChronicDuration ::解析(' 4小时)
http://everydayrails.com/2010/08/11/ruby-date-time-parsing-chronic.html
答案 5 :(得分:-1)
>> strings = ['4 hours', '48 hours', '3 days', '15 minutes', '2 months', '5 years', '2 decades']
=> ["4 hours", "48 hours", "3 days", "15 minutes", "2 months", "5 years", "2 decades"]
>> ints = strings.collect{|s| eval "#{s.gsub(/\s+/,".")}.to_i" rescue "Error"}
=> [14400, 172800, 259200, 900, 5184000, 157788000, "Error"]