执行以字符串形式接收的datetime命令

时间:2018-08-12 13:25:22

标签: ruby-on-rails ruby

我有一个字符串格式的日期信息"20.days.from_now"。有了这个基准,我应该能够找到任何给定时间点的确切日期。但是我找不到执行它的方法。

尝试:

1. "20.days.from_now".to_datetime => returns DateTime.now.beginning_of_day + 20.seconds
2. "20.days.from_now".to_datetime => returns Time.now.beginning_of_day + 20.seconds

不能将此参数作为参数传递给Time / DateTime方法。

有没有一种有效的方法来实现这一目标?

可能的输入可能是:

1. "20.days.from_now"
2. "45.seconds.from_now"
3. "-11.months.from_now"
4. "3.years.from_now"
5. "15.hours.from_now"
6. "860.minutes.from_now"

3 个答案:

答案 0 :(得分:1)

否,Rails没有内置的方法({{1}以外,您肯定不想要)。

您可能需要使用特定于您的用例的正则表达式编写一个解析器。

尝试类似的东西:

eval

答案 1 :(得分:0)

我同意@matthewd。您可以使用eval,但不能使用。

我不会使用正则表达式。

只需拆分字符串并进行处理:

 parts = input.split('.')
 # assuming first part is always a number
 number = parts[0].to_i
 # what methods you allow user to chain
 allowed_methods = %w[days seconds ...] 
 method_chain = parts[1..-1]
 raise 'forbidden' unless method_chain.all? { |m| allowed_methods.include?(m) }
 # just invoke methods one by one
 res = method_chain.reduce(number) { |r, m| r.call(m) } 

处理完全取决于您希望输入的内容

答案 2 :(得分:0)

您首先要解析一个数字,然后解析其单位。您可以通过以下方式实现它:

def parse_date_from_string(str)
  number = str.split(".")[0].to_i
  unit = str.split(".")[1]
  return number.send(unit).from_now
end

给出您建议的输入,输出将是:

[21] pry(main)> parse_date_from_string("20.days.from_now")
=> Sat, 01 Sep 2018 17:40:19 -03 -03:00
[22] pry(main)> parse_date_from_string("45.seconds.from_now")
=> Sun, 12 Aug 2018 17:41:04 -03 -03:00
[23] pry(main)> parse_date_from_string("-11.months.from_now")
=> Tue, 12 Sep 2017 17:40:19 -03 -03:00
[24] pry(main)> parse_date_from_string("3.years.from_now")
=> Thu, 12 Aug 2021 17:40:19 -03 -03:00
[25] pry(main)> parse_date_from_string("15.hours.from_now")
=> Mon, 13 Aug 2018 08:40:19 -03 -03:00
[26] pry(main)> parse_date_from_string("860.minutes.from_now")
=> Mon, 13 Aug 2018 08:00:19 -03 -03:00