2016-11-25 60 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可能落在不同的年份。