2016-05-06 176 views
0

我正在創建一個程序,它可以使給用戶寫電子郵件的任務變得更簡單,但是我需要找出一種方法來跳過星期六和星期天,在我們待處理的電子郵件過程中用戶有6天的時間來回復,所以我需要的是一種讓Ruby的Date類跳過星期六和星期日的方法,並且保持6天的準確計數,不包括週末。紅寶石跳過日期

例如:

require 'date' 

date = Date.today 
#=> #<Date: 2016-05-06 ((2457515j,0s,0n),+0s,2299161j)> 
new_date = date + 6 
#=> #<Date: 2016-05-12 ((2457521j,0s,0n),+0s,2299161j)> 
new_date.strftime('%A') 
#=> "Thursday" 
date.strftime('%A') 
#=> "Friday" 

顯然,這個例子計數週六和週日,所以我怎麼跳過這兩天,並保持計數準確嗎?

+1

如果是「星期六」或「星期天」,則可以使用'date.strftime('%A')'檢查日期,然後使用if條件跳過任務。 –

+0

我會給你一個鏡頭。但是,這不會幫助保持計數的準確性? – 13aal

回答

4

這裏是你的需求描述的文字翻譯成紅寶石:

require "date" 

p today = Date.today 
p (1..Float::INFINITY) 
    .lazy 
    .map { |offset| today + offset } 
    .reject { |date| date.saturday? || date.sunday? } 
    .drop(5) 
    .next 

的代碼創建的所有天懶惰枚舉從開始明天,拒絕所有星期六和星期日,放棄接下來的5個有效候選人,並返回下一個。

輸出:

#<Date: 2016-05-06 ((2457515j,0s,0n),+0s,2299161j)> 
#<Date: 2016-05-16 ((2457525j,0s,0n),+0s,2299161j)> 

在日曆快速偷看錶明輸出是正確的。

+0

'.lazy',字面意思是我的早晨謝謝 – 13aal

+0

這太酷了!我寫了一個腳本,將算法實現爲一種方法,並打印出值以證明結果是正確的。它位於https://gist.github.com/keithrbennett/50598f478a6ad898ab3793f0d8b5052a。而且,上限不一定非常高, 10爲我工作。 –

2

您可以使用兩種方法saturday?sunday?

>> require 'date' 
=> true 
>> d = Date.new(2016, 05, 3) 
=> #<Date: 2016-05-03 ((2457512j,0s,0n),+0s,2299161j)> 
>> d.saturday? 
=> false 
>> d.sunday? 
=> false 
>> a = d + 6 
=> #<Date: 2016-05-09 ((2457518j,0s,0n),+0s,2299161j)> 
>> a.saturday? 
=> false 
>> d = Date.today 
=> #<Date: 2016-05-06 ((2457515j,0s,0n),+0s,2299161j)> 
>> a = d + 1 
=> #<Date: 2016-05-07 ((2457516j,0s,0n),+0s,2299161j)> 
>> a.saturday? 
=> true 
4

您可以實現通過使用Date#saturday?Date#sunday?

或者自己的東西,你可以使用business time寶石來處理這一切爲您服務。根據您的需要配置它後(如設置「工作時間」是從午夜 - >午夜,如果這就是你想要的東西),然後你可以不喜歡各種各樣的事情:

6.business_days.after(Date.new(2014, 02, 7)) 
6.business_days.from_now 

等等上。

+0

這是一個壞蛋寶石!感謝你! – 13aal

+0

我對寶石有點警惕,那些猴子會像數字課程那樣修補核心課程。這款寶石是非常廣泛使用和信任的嗎? –

+0

是的。非常廣泛地使用。但是,您可以想象,您需要小心如何使用它。我所看到的最大的錯誤是編寫單元測試的人不使用營業時間 - 而最終你會得到「隨機」失敗的測試。 (實際上,在特定的時間/星期/月份失敗。)但是這對圖書館本身並不是問題。僅限於使用它的方式。 –