【问题标题】:Parse "X years and Y weeks ago" alike strings in Ruby在 Ruby 中解析“X 年和 Y 周前”类似的字符串
【发布时间】:2011-06-16 21:11:20
【问题描述】:

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

可能的句子有:

  • 1 年|@count 年(和 1 周|@count 周)前
  • 1 周|@count 周(和 1 天|@count 天)前
  • 1 天|@count 天(和 1 小时|@count 小时)前
  • 1 小时|@count 小时前(和 1 分钟|@count 分钟)前
  • 1 分钟|@count 分钟前(和 1 秒|@count 秒)前
  • 1 秒|@count 秒前

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

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

我希望有一个 gem 或 sn-p 可以处理这个问题。

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

旁注:供将来参考:这些是 Drupals Format Interval 生成的时间字符串

【问题讨论】:

    标签: ruby parsing datetime


    【解决方案1】:

    Chronic gem 可能正是您要找的。​​p>

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

    根据@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
    

    【讨论】:

    • (Chronic 维护者在这里)@dmarkow 是正确的,Chronic 不能处理像“1 年零 1 周前”这样的事情,不过,通常很容易将它们分成几个部分并单独处理。不过,请随时在github.com/mojombo/chronic 提出功能请求,我会调查一下!
    • 补充(我不想为这个问题提供另一个答案,这个答案应该是公认的)。签出此 sn-p 以进行多次处理:gist.github.com/61529720a993aaad30a3
    • @injekt 不错!我将纳入我的答案。
    • 我已经更改了@injekt 的答案,因此它可以处理“foo and bar ago”以及“foo ago”字符串。 gist.github.com/7920a8cfc62cf03ee179
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多