Использование Ruby Chronic для расчета смещения даты - PullRequest
0 голосов
/ 07 ноября 2011

Я использую хронику, чтобы возвращать проанализированные объекты даты, например так:

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 Ответ

1 голос
/ 07 ноября 2011

Прежде всего, это 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)

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

...