2012-09-28 33 views
2

我有一個對象,它有一個屬性叫做effective_date,它是Date類型。
從今天起,我必須在一個對象effective_date的3個工作日前完成一項任務。

例如:如果effective_date是星期六,2012年9月29日,我必須在2012年9月25日星期二完成一項任務,即在星期三之前的3個工作日。 。

如果effective_date是2012年9月30日星期日,我必須在2012年9月26日星期三的星期三完成一項任務,也就是星期三前的星期三。

如果effective_date是2012年9月28日星期五,我必須在2012年9月25日星期二完成一項任務,即在星期三之前的3個工作日。 (星期三,星期五,星期五)

我試了一些代碼,但它不適用於所有情況。請幫忙找到2日期之間的工作日數

回答

3

退房Weekdays gem。它可以讓你做的東西一樣

>> -3.weekdays_from(Date.civil(2012,9,28)) 
=> Tue, 25 Sep 2012 
>> -3.weekdays_from(Date.civil(2012,9,29)) 
=> Wed, 26 Sep 2012 
>> -3.weekdays_from(Date.civil(2012,9,30)) 
=> Wed, 26 Sep 2012 

或也許是做同樣的事情用不同的語法business_time gem

>> 3.business_days.before(Date.civil(2012,9,28)) 
=> 2012-09-25 00:00:00 +0200 
>> 3.business_days.before(Date.civil(2012,9,29)) 
=> 2012-09-26 00:00:00 +0200 
>> 3.business_days.before(Date.civil(2012,9,30)) 
=> 2012-09-26 00:00:00 +0200 
+0

非常感謝,我會研究。不知道寶石如何做到這一點。 –

+0

閱讀gem代碼:https://github.com/mdarby/weekdays/blob/master/lib/weekdays.rb'直到x == self; curr_date - = 1.days; x - = 1如果curr_date.weekday ?; 結束# – rewritten

+0

是這樣做,謝謝:) –

2

你可以遍歷天,計數,當您去,例如算你可以做

(Date::civil(2012,9,26)..Date::civil(2012,9,30)).count {|date| date.wday >= 1 && date.wday <= 5} 
+0

謝謝,我會考慮它:) –

0

讀什麼寶石做月26日和30日之間的工作日數,你也可以做自己的助手方法:

require 'active_support/core' 

module Weekdays 
    WD_AGO_DIFF = Hash.new(1).merge(1=>3, 0=>2) 
    WD_FROM_DIFF = Hash.new(1).merge(5=>3, 6=>2) 
    def weekdays_before(date=Time.now) 
    self.times.inject(date) { |d| d - WD_AGO_DIFF[d.wday].days } 
    end 
    def weekdays_after(date=Time.now) 
    self.times.inject(date) { |d| d + WD_FROM_DIFF[d.wday].days } 
    end 
end 

class Fixnum 
    include Weekdays 
end 

6.times do |n| 
    p [n, n.weekdays_before, n.weekdays_after] 
end 
+0

謝謝你。我會研究代碼。 –