2011-11-07 150 views
0

内我有一个包含截止日期列表的对象,我想建立时指定的日期为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

您可以使用日期解析器:Kronoschronic为克罗诺斯

例子:

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

该功能为您提供了Kronos的对象,而今年其更容易进行比较,建立范围等。

+0

慢性分析器的时候看起来正是即时寻找。由于 – namtax

+0

@namtax,请我感兴趣的这个问题,你是如何能够解决它 –

1

是的,你可以使用慢性,你也可以写一个工人将继续检查,如果在指定的日期为1个月或更小隔一段时间就进行一次到期日之前。并要求员工做一些事情,如果结果为真(比如您发送电子邮件,或什么,如果日期为到期日之内),您可以通过google搜索Resque和Redis的发现有关工作的更多信息。另一种选择是将一些基础参考上的两个日期进行转换,然后进行计算。

+0

我想我会去慢性现在,但Resue namtax

+0

[这里](http://railscasts.com/episodes/271-resque)是Resque一个简单的啧啧。 –

+0

太棒了!欣赏它 – namtax