Дата возврата, если в пределах диапазона дат - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть объект, который содержит список сроков, я пытаюсь создать систему, которая возвращает дату, когда указанная дата составляет 1 месяц или менее до даты оплаты.Должен возвращаться срок оплаты в этом формате «1 февраля 2009».Позвольте мне уточнить, используя мой текущий код

#Build array of estate objects
estate.due_dates = "1st Feb,  3rd May,  1st Aug,  5th Nov"
estate2.due_dates = "28th Feb, 31st May, 31st Aug, 30th Nov"

estates = [estate,estate2]    

set_due_date_on_estates("1st Jan 2009",estates) #Run function - should return "1st Feb 2009,28th Feb 2009"

def set_due_date_on_estates(date,estates)
estates.each{|estate| 
    estate.due_dates.split(",").each{|due_date|
    ((date)..(date >> 1)).each{|current_date|
     estate.set_reminder(due_date + current_date.strftime("%Y")) if current_date.strftime('%d %m') ==       
     Date.parse(due_date).strftime('%d %m')
   }
 }
end
}

Проблема, с которой я столкнулся, заключается в том, что в моем списке сроков не указан год, поэтому я перебираю свой диапазон и проверяю, совпадают ли датыформат "% d% m".Если это так, я устанавливаю напоминание в объекте состояния, используя текущую «дату исполнения» в цикле, соединенную с Годом «текущей даты» в цикле.

Я не слишком доволен кодом, в частности вложенными циклами, и удивляюсь, есть ли лучший способ, которым я мог бы заниматься проверкой, что due_dates где-то в диапазоне дат, даже если due_dates не имеют года.Спасибо

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Вы можете использовать парсеры даты: Кронос , хронический

Пример для крон:

def parse_date(date)
  Kronos.parse(date.sub(/\d{4}$/, ''))
end

Эта функция дает объект Kronos без года, который легче сравнивать, строить диапазон и т. Д.

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

Да, вы можете использовать Chronic, а также вы можете написать работника, который будет продолжать проверять, является ли указанная дата за 1 месяц или менее до установленной даты через регулярные промежутки времени.И попросите этого работника что-то сделать, если результат верен (скажем, отправьте вам электронное письмо или что-то еще, если дата в срок), вы можете найти больше информации о работнике, прибегая к помощи Resque и Redis.Другой вариант - преобразовать обе даты по некоторой базовой ссылке, а затем выполнить вычисления.

...