Использование Ruby 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"))

Это возвращает ноль, как и другие попытки, как с переменными, так и с жестко закодированным:

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 без рельсов. Это небольшие скрипты, хотя я с радостью включу все драгоценные камни, необходимые для работы.

1 ответ

Решение

Во-первых, это Ruby 1.8 или 1.9? Если 1.9, у вас есть Date#strptime доступный метод, который делает разбор дат из строк довольно простым.

Если у вас есть дата оплаты, получить ее на две недели раньше довольно легко, даже без Chronic.

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)

Если вы не против обойти частную защиту, это работает просто отлично.

Другие вопросы по тегам