使用Ruby Chronic计算日期偏移量

时间:2011-11-07 15:52:10

标签: ruby chronic

我使用chronic来返回解析后的日期对象,如下所示:

last_pay_date = Date.parse(Chronic.parse('2011-11-04').strftime("%Y-%m-%d"))
two_weeks_ago = Date.parse(Chronic.parse("two weeks ago").strftime("%Y-%m-%d"))

puts last_pay_date # 2011-11-04
puts last_pay_date.class # Date
puts two_weeks_ago # 2011-10-24
puts two_weeks_ago.class # Date

但我真正想做的是约会一个像last_day_date这样的日期对象并在返回前两周保留日期,如下所示:

two_weeks_ago = Date.parse(Chronic.parse("two weeks before #{last_pay_date}").strftime("%Y-%m-%d"))

与其他尝试一样,返回nil,包括变量和硬编码:

last_pay_date = Date.parse(Chronic.parse('2011-11-04').strftime("%Y-%m-%d"))
two_weeks_ago = Chronic.parse("two weeks before #{last_pay_date}")
puts two_weeks_ago.class #NilClass
puts two_weeks_ago.nil? #true

two_weeks_ago = Chronic.parse("2 weeks before 2011-11-04 05:00:00")
puts two_weeks_ago.class #NilClass
puts two_weeks_ago.nil?  #true

问题:

  1. 我可以使用慢性来解析现有日期对象的偏移量吗? (例如,在此日期之前14天而不是仅仅+14天)。

  2. 我可以使用慢性来解析现有日期的偏移吗?

  3. 即使解决方案不在慢性病中,如何最好地完成这项工作?

  4. 编辑:我正在运行没有rails的Ruby 1.9.2。这些是直接的ruby脚本,但我很乐意包含完成这项工作所需的任何宝石。

1 个答案:

答案 0 :(得分:1)

首先,这是Ruby 1.8还是1.9?如果是1.9,则可以使用Date#strptime方法,这样可以很容易地从字符串中解析日期。

一旦你有了自己的支付日期,即使没有慢性疾病,提前两周也会很容易。

Date.strptime("11/7/2011", "%m/%d/%Y").next_day(-14)

如果这是Ruby 1.8,那么如果ActiveSupport可用(即,如果这是一个Rails应用程序),那么Fixnum扩展会使这个变得微不足道。

last_pay_date - 2.weeks

但是,我怀疑它不可用。在Ruby 1.8.7中,Date#next_day是私有的,所以你不能直接调用它,但如果你真的想要,你仍然可以调用它。

Date.parse("11/7/2011").send(:next_day, -14)

如果你不介意绕过私人保护,这就可以了。

相关问题