2

我有一个对象,它有一个名为 Effective_date 的属性,它是 Date 类型。
从今天开始,我必须在对象有效日期前 3 个工作日完成任务。

示例:如果有效日期是 2012 年 9 月 29 日星期六,我必须在 2012 年 9 月 25 日星期二执行一项任务。即星期六前 3 个工作日。.

如果有效日期是 2012 年 9 月 30 日星期日,我必须在 2012 年 9 月 26 日星期三完成一项任务。即星期六前 3 个工作日。

如果有效日期是 2012 年 9 月 28 日星期五,我必须在 2012 年 9 月 25 日星期二完成一项任务。即星期六前 3 个工作日。(周三、周四、周五)

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

4

3 回答 3

3

查看工作日宝石。它允许你做类似的事情

>> -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
于 2012-09-28T09:09:38.697 回答
2

您可以遍历天数,边走边算,例如计算 9 月 26 日到 30 日之间的工作日数

(Date::civil(2012,9,26)..Date::civil(2012,9,30)).count {|date| date.wday >= 1 && date.wday <= 5}
于 2012-09-28T09:17:44.727 回答
0

阅读 gems 的作用,你也可以做你自己的 helper 方法:

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
于 2012-09-28T10:20:34.837 回答