在Ruby中解析“X years and Y weeks ago”中的相似字符串

时间:2011-06-16 21:11:21

标签: ruby parsing datetime

是否有一个通用解析器来解析“... previous”字符串并将它们转换为DateTime对象?

可能的句子是:

  • 1年| @count岁(和1周| @count周)前
  • 1周| @count周(和1天| @count天)之前
  • 1天| @count天(和1小时| @count小时)前
  • 1小时| @count小时前(和1分钟| @count分钟前)
  • 1分钟| @count分钟前(和1秒| @count秒)前
  • 1秒| @count sec ag​​o

所以它要么是两个的组合(Foo和Bar之前),要么只有一个(Foo之前​​)。它可以是单数或复数。

Ruby的DateTime::parse()无法处理此问题,DateTime::strptime()也无法处理。

我希望在某个地方处理这个问题的宝石或片段。

否则我将不得不创建自己的解析器,在这种情况下,非常欢迎指向如何创建自己的DateTime解析器的指针。

旁注:未来参考:这些是由Drupals Format Interval生成的时间串

1 个答案:

答案 0 :(得分:9)

Chronic宝石可能就是你要找的东西。

require 'chronic'
Chronic.parse "2 days ago"
# => 2011-06-14 14:13:59 -0700

Per @injekt(Chronic的维护者之一),你可以像这样处理“1年1周前”:

str = "one year and 1 week ago"
chunks = str.split('and')

Chronic.parse(chunks[1], :now => Chronic.parse(chunks[0] + 'ago'))
#=> 2010-06-09 14:29:37 -0700