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_date
とend_date
間の各日付オブジェクトd
が選択されます。論理式は「d.day
その日未満last_day
あると月の最終日である)a)の指定された配列days
がd.day
又は Bを含む」、読み出します。 d.day
は、d
の月が翌月(d+1
)の月と異なる場合は、その月の最終日です。 (d
は12月31日(月12
)に該当する場合は、次の日は、月1
に落ちるので、私たちは12 < 1
ではなく12 != 1
をテストする必要があります。)
はフォーマッティングコードの説明についてはDate#strftimeを参照してください。
start_date
およびend_date
は、異なる年になる可能性があります。
日付はどのような形式ですか?あなたの例は恣意的で、Rubyコードではありません。また、あなたの必要条件がここにあるのかもはっきりしていません。この恣意的な '<<"の代わりにあなたの値に 'reject'を使うのはなぜですか? – tadman
'ActiveSupport'から' beginning_of_month'と 'end_of_month'を使うことができます。 –