Ruby(使用Rails)将一串时间转换为秒?

时间:2011-01-07 08:49:16

标签: ruby-on-rails ruby datetime date time

所以,我有一串时间......就像

那样
'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天(没有信息错误)等。

有没有一种简单的方法可以将这些字符串转换为秒?


6 个答案:

答案 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中获得一些好的工作。

此外,还有一些good to know info about dates/times in ruby

答案 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"]
相关问题