2017-11-27 7 views
0

This threadは、今日の日付の後の最初の出現(たとえば、木曜日)を見つける答えを提供します。指定された日付の後の特定の日の最初の出現を取得します。

任意の日付(たとえば、2017年11月1日)の後に最初の日(例:木曜日)が表示される、より一般的な関数を取得したいと考えています。

したがって、このメソッドでは、Date(StringまたはDateオブジェクト)とDate(String)の2つの引数をとります。

私が見つけた1つの方法は、メソッド(例:my_date_object.thursday?)を使用して毎日確認することですが、確認する日を確認するにはswitch/if-elseステートメントが必要です。以下。

def get_next_day_after_date(date, day) 
    days_in_week = 7 
    week = [] 
    days_in_week.times { |day_after| week << (date + day_after) } 
    if day.casecmp('Monday').zero? 
    week.select(&:monday?) 
    elsif day.casecmp('Tuesday').zero? 
    week.select(&:tuesday?) 
    elsif day.casecmp('Wednesday').zero? 
    week.select(&:wednesday?) 
    # same code for Thursday to Sunday 
    end 
end 

純粋なRubyでこれを達成するためのよりクリーンな方法がありますか? (active_supportの使用やレール固有の方法は使用しない)。

答えて

1
require "date" 

def get_next_day_after_day(date, day) 
    date + (Date.strptime(day, "%A") - date) % 7 
end 
+1

ありがとうございました。これを使用しようとする人は、メソッドが 'DateTime'オブジェクトとは異なる振る舞いをするので、この関数の動作は' Date'オブジェクトと一緒に使うべきであることに注意してください。たとえば、 'Friday 24 November 2017 00:00'を表す' DateTime'オブジェクトでこれを呼び出すと、'2011年11月24日 'を表す日付オブジェクトが返されますが、 'DateTime'オブジェクトの同じメソッドを' 2017年11月24日15:00'は '2017年12月1日 'に設定された日付オブジェクトを返します。 – Pauline

+0

'DateTime'オブジェクトで安全に使うために、メソッドは次のように編集できます:' date +(Date.strptime(day、 '%A') - date.to_date)%7' – Pauline

関連する問題