2014-07-25 59 views
0

所以我想要一個方法,我可以通過它在一個月的一天和一個時間,它會找到下一個有效的DateTime。所以如果這天是9月15日,我正在尋找17日,那麼9月17日將會回來。但是如果我正在尋找第31名,那麼將於9月31日返回10月31日不存在。查找下一個有效的日期給予一天和一天的時間

我只是想創建一個方法,但它並沒有考慮到無效的日期:

def find_next_date(day, time) 
    now = Time.now 

    if (day == now.day && time > now.strftime("%H%M%S%N")) || day > now.day 
    DateTime.new(now.year, now.month, day, time) 
    else 
    if now.month + 1 > 12 
     year += 1 
     month = 1 
    else 
     year = now.year 
     month = now.month + 1 
    end 

    DateTime.new(year, month, day, time) 
    end 
end 

有沒有更好的方式來做到這一點,它會考慮到無效的日期?

回答

0

你可以試試這個。我沒有處理time部分,因爲我不確定你發送的參數是什麼孩子(StringTime),但這應該讓你順利。

class DateTime 
    def self.find_next_date(day,time="00:00:00+00:00") 
    raise ArgumentError if day > 31 || day < 1 
    current_date = Date.today 
    while current_date.day != day 
     current_date = current_date.next_day 
    end 
    DateTime.parse(current_date.strftime("%Y-%m-%dT#{time}")) 
    end 
end 

DateTime.find_next_date(31) 
#=> #<DateTime: 2014-07-31T00:00:00+00:00 ((2456870j,0s,0n),+0s,2299161j)> 
DateTime.find_next_date(30) 
#=> #<DateTime: 2014-07-30T00:00:00+00:00 ((2456869j,0s,0n),+0s,2299161j)> 
DateTime.find_next_date(1) 
#=> #<DateTime: 2014-08-01T00:00:00+00:00 ((2456871j,0s,0n),+0s,2299161j)> 
DateTime.find_next_date(25) 
#=> #<DateTime: 2014-07-25T00:00:00+00:00 ((2456864j,0s,0n),+0s,2299161j)> 
DateTime.find_next_date(22,"01:00:00+00:00") 
#=> #<DateTime: 2014-08-22T01:00:00+00:00 ((2456892j,0s,0n),+0s,2299161j)> 
DateTime.find_next_date(32) 
#=> ArgumentError: ArgumentError 

似乎應該爲你工作,但也有一些處理的time要到位

+0

嗯這會給我,我要找的答案,但我有點不喜歡它基本保持迭代以蠻力的方式。但這是我現在能想到的唯一方法。我可能會將next_day用於我自己的版本。謝謝! – Dragonfly

+0

@Dragonfly我可以同意你的看法,但它似乎是最簡潔的解決方案,沒有過多複雜的事情,最大迭代大約是59.我確實考慮從Date.today創建一個範圍到(Date.today + 1.month)。 end_of_month,但意識到迭代將是相同的,並且遠不那麼簡潔,並且會在二月造成問題祝你好運。 – engineersmnky

相關問題