Dateタイプのeffective_dateという属性を持つオブジェクトがあります。
今日からオブジェクトが有効になる3週間前にタスクを実行する必要があります。
例:effective_dateが2012年9月29日土曜日の場合、2012年9月25日火曜日にタスクを実行する必要があります。つまり、土曜日の3週間前です。。
Effective_dateが2012年9月30日の日曜日の場合、2012年9月26日の水曜日にタスクを実行する必要があります。つまり、土曜日の3週間前です。
Effective_dateが2012年9月28日金曜日の場合、2012年9月25日火曜日にタスクを実行する必要があります。つまり、土曜日の3週間前です。(水、木、金)
いくつかのコードを試しましたが、すべての場合に機能するわけではありません。助けてください
質問する
1612 次
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_timegem :
>> 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
宝石の機能を読んで、独自のヘルパーメソッドを実行することもできます。
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 に答える