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"]
每個日期對象d
start_date
和end_date
之間如果邏輯表達式返回true
被選擇。邏輯表達式讀,「一個)給定的陣列days
包括d.day
或 B)d.day
是月和那天小於last_day
的最後一天」。 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' –