2

曜日名を含む文字列が与えられた場合、つまり"Wednesday"、現在の週 (月曜日から日曜日) 内のその日を表す Time オブジェクトを取得するにはどうすればよいですか?

たとえば、現在の日が 5 月 29 日火曜日で、文字列が"Monday"の場合、時間オブジェクトは を表す必要がありMonday 28 Mayます。文字列が である場合は"Friday"、 である必要がありますFriday 1 June

一方、現在の日が 6 月 5 日火曜日で、文字列が"Monday"の場合、時刻オブジェクトは を表す必要がありMonday 4 Juneます。文字列が である場合は"Friday"、 である必要がありますFriday 8 June

Rails 3.2.0 と Ruby 1.9.2 を使用しています。

4

2 に答える 2

7

これらのタイプのテキスト日付参照には、 http://chronic.rubyforge.org/ と呼ばれる非常に便利な gem がありChronicます

あなたの目的のために、"this week"参照を使用できます:

Chronic.parse("monday this week")
Chronic.parse("friday this week")
..etc..

..期待どおりに動作するはずです。

于 2012-05-30T01:42:28.037 に答える
2

計算するのは簡単ですが、最初に曜日名を解析する必要があります。つまり、曜日のリストが必要です。

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#wday0 は日曜日を意味するため、このように数字が機能するためです)。ただし、週の最初の日として別の日を使用するように簡単に調整できます。

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
于 2012-05-30T02:14:51.750 に答える