我有一个字符串格式的日期信息"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"
答案 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