2016-11-25 74 views
0

我正在寻找一种干净的方式来获取一组日期并考虑一年内的整个范围。如何从红宝石日期列表中获取最新日期

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

什么I'm期待与所有日期的数组从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"] 

每个日期对象dstart_dateend_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_dateend_date可能落在不同的年份。