Использование 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
Вопросы:
Могу ли я использовать хронический для анализа смещений существующих объектов даты? (например, за 14 дней до этой даты вместо всего лишь +14 дней).
Могу ли я использовать хронический для анализа смещений существующих дат вообще?
Как это лучше всего сделать, даже если решение за пределами хронического?
Изменить: я бегу 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)
Если вы не против обойти частную защиту, это работает просто отлично.