如果在日期范围内,则返回日期

时间:2011-11-07 09:32:40

标签: ruby date-range

我有一个包含截止日期列表的对象,我正在尝试构建一个系统,该系统在截止日期前1个月或更短的时间内返回截止日期。它应以“2009年2月1日”格式返回到期日。让我澄清一下,使用我目前的代码

#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 个答案:

答案 0 :(得分:2)

您可以使用日期解析器:Kronoschronic

kronos示例:

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

这个函数为你提供了一个没有年份的Kronos对象,它更容易比较,构建范围等。

答案 1 :(得分:1)

是的,您可以使用慢性病,并且您也可以编写一名工作人员,该工作人员会定期检查指定日期是否在截止日期前1个月或更短时间。如果结果是真的要求工人做某事(比如说如果日期在截止日期之前给你发电子邮件或其他任何东西)你可以通过谷歌搜索Resque和Redis来找到关于工人的更多信息。另一个选择是在某个基准参考上转换两个日期,然后进行计算。