我有一个对象,它有一个名为effective_date的属性,其中包含Date类型。
我必须在工作日之前的3个工作日从今天开始执行一个有效的事件。
示例:如果effective_date是星期六,2012年9月29日我必须在2012年9月25日星期二执行任务。即在工作日之前的3个工作日。 。
如果effective_date是Sun,2012年9月30日我必须在2012年9月26日星期三完成一项任务。即在工作日之前的3个工作日。
如果effective_date是星期五,2012年9月28日,我必须在2012年9月25日星期二完成一项任务。即在工作日之前的3个工作日。 (星期三,星期五,星期五)
我尝试了一些代码但它并不适用于所有情况。请帮忙
答案 0 :(得分: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
答案 1 :(得分:2)
您可以在这些日子里进行迭代计算,例如计算9月26日到30日之间的工作天数
(Date::civil(2012,9,26)..Date::civil(2012,9,30)).count {|date| date.wday >= 1 && date.wday <= 5}
答案 2 :(得分:0)
阅读宝石的内容,你也可以自己做帮助方法:
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