2016-11-25 5 views
0

日付の配列を取得し、1年で全体の範囲を考慮するきれいな方法を探しています。ルビーの日付リストから最新の日を取得するには

days = [1, 31] 
dates = [] 
(start_date..end_date).each do |date| 
    dates << if days.include? date.day 
end 

は何 - 私が探してdaysからのすべての日付を持つ配列であり、日が月に存在しない場合、最新のものを使用します。

[nov 1, nov 30, dec 1, dec 31 ...] 
+0

日付はどのような形式ですか?あなたの例は恣意的で、Rubyコードではありません。また、あなたの必要条件がここにあるのかもはっきりしていません。この恣意的な '<<"の代わりにあなたの値に 'reject'を使うのはなぜですか? – tadman

+0

'ActiveSupport'から' beginning_of_month'と 'end_of_month'を使うことができます。 –

答えて

1
require 'date' 

days  = [1, 15, 31] 
    #=> [1, 15, 31] 
last_day = days.max 
    #=> 31 
start_date = Date.parse 'Jan 4, 2016' 
    #=> #<Date: 2016-01-04 ((2457392j,0s,0n),+0s,2299161j)> 
end_date = Date.parse 'Nov 16, 2016' 
    #=> #<Date: 2016-11-16 ((2457709j,0s,0n),+0s,2299161j)> 

(start_date..end_date).select do |d| 
    days.include?(d.day) || (((d+1).month != d.month) && (d.day < last_day)) 
end.map {|d| d.strftime("%b %-d")} 
    #=> ["Jan 15", "Jan 31", "Feb 1", "Feb 15", "Feb 29", "Mar 1", "Mar 15", 
    # "Mar 31", "Apr 1", "Apr 15", "Apr 30", "May 1", "May 15", "May 31", 
    # "Jun 1", "Jun 15", "Jun 30", "Jul 1", "Jul 15", "Jul 31", "Aug 1", 
    # "Aug 15", "Aug 31", "Sep 1", "Sep 15", "Sep 30", "Oct 1", "Oct 15", 
    # "Oct 31", "Nov 1", "Nov 15"] 

論理式がtrueを返す場合start_dateend_date間の各日付オブジェクトdが選択されます。論理式は「d.dayその日未満last_dayある月の最終日である)a)の指定された配列daysd.day又は Bを含む」、読み出します。 d.dayは、dの月が翌月(d+1)の月と異なる場合は、その月の最終日です。 (dは12月31日(月12)に該当する場合は、次の日は、月1に落ちるので、私たちは12 < 1ではなく12 != 1をテストする必要があります。)

はフォーマッティングコードの説明についてはDate#strftimeを参照してください。

start_dateおよびend_dateは、異なる年になる可能性があります。

関連する問題