0

我使用慢性返回解析的日期对象,如下所示:

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. 即使解决方案不是慢性的,如何最好地实现这一点?

编辑:我正在运行没有导轨的 Ruby 1.9.2。这些都是 ruby​​ 脚本,尽管我很乐意包含完成这项工作所需的任何 gem。

4

1 回答 1

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)

如果您不介意绕过私有保护,这很好用。

于 2011-11-07T16:12:53.520 回答