2011-11-07 195 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