查找2个日期之间的工作日数

时间:2012-09-28 08:45:33

标签: ruby-on-rails ruby

我有一个对象,它有一个名为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个工作日。 (星期三,星期五,星期五)

我尝试了一些代码但它并不适用于所有情况。请帮忙

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