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' –