計算するのは簡単ですが、最初に曜日名を解析する必要があります。つまり、曜日のリストが必要です。
WEEKDAY_NAMES = %w<Sunday Monday Tuesday Wednesday Thursday Friday Saturday>
それらのハードコーディングを避けたい場合 (Ruby 1.8 を使用している場合はロケール設定を優先することも)、代わりに次のようにできます。
WEEKDAY_NAMES = (3..9).map { |i| Time.at( i * 86400 ).utc.strftime '%A' }
次に、次のようなロジックを使用して番号を取得できます。
wday = WEEKDAY_NAMES.each_with_index.find{|name,number|name == 'Wednesday'}[1]
または、より良いのは、name->number のペアのハッシュを構築することです。
wday_from_name = Hash[*WEEKDAY_NAMES.each_with_index.to_a.flatten]
wday = wday_from_name['Wednesday']
目標の曜日を数値形式で取得したら、次のようにします。
now = Time.now
wday_this_week = now + (wday - now.wday) * 86400
Chronic とは異なり、このメソッドは週を日曜日から土曜日までと見なします ( Time#wday
0 は日曜日を意味するため、このように数字が機能するためです)。ただし、週の最初の日として別の日を使用するように簡単に調整できます。
WEEK_START = wday_from_name['Monday']
wday_this_week = now +
((wday - WEEK_START)%7 - (now.wday - WEEK_START)%7) * 86400
Rails を使用しているため、ActiveSupport コア拡張機能を使用して、これを少しきれいにすることができます。
WEEKDAY_NAMES = (3..9).map { |i| Time.at( i.days ).utc.strftime '%A' }
wday_this_week = now +
((wday - WEEK_START)%7 - (now.wday - WEEK_START)%7).days