在没有eval的情况下解析日期字符串的温和方式

时间:2017-10-30 21:55:59

标签: ruby-on-rails ruby

我有以下字符串:

24 hours
7 days
45 days
2 seconds
5 years

等。所有这些代表铁路电话,例如24.hours7.days45.days,它们始终返回Integer

我可以使用eval轻松解析这些字符串(先用点替换空格)。

我还可以编写一些复杂的解析器,它将查找yearsyear并将其替换为秒数。

但有没有更温和的方法来解析这些字符串?

2 个答案:

答案 0 :(得分:1)

我不知道这是否是 gentler ,但这是一种方法(现在几乎没有错误检查):

def parse_time_span(value)
  acceptable_time_units = ["minute", "second", "week", "day", "hour", "month", "year"]
  value.match /([0-9]+) (.*)/
  return nil unless $1 && $2
  return nil unless acceptable_time_units.include?($2) || acceptable_time_units.collect{|x| x.pluralize}.include?($2)
  $1.to_i.send $2.to_sym
end

答案 1 :(得分:0)

之前我使用过timespan gem,解析基于Spanner

require 'spanner'
Spanner.parse("24 hours") #=> 86400
Spanner.parse("5 years") #=> 157784630