如何获得所有特定日期'在一个日期范围内

时间:2016-08-29 06:03:12

标签: ruby-on-rails ruby ruby-on-rails-3

我怎样才能说出从X年到Y年的周六和周日的所有日期并将它们存储为数组?伪代码将是

(year_today..next_year).get_all_dates_for_saturday_and_sunday

或许也有宝石迎合这个?

3 个答案:

答案 0 :(得分:3)

试试这个:

(Date.today..Date.today.next_year).select { |date|
  date.sunday? or date.saturday?
}

#=> [Sat, 03 Sep 2016,Sun, 04 Sep 2016,Sat, 10 Sep 2016,Sun, 11 Sep 2016...

答案 1 :(得分:0)

(Date.today..(Date.today + 1.year)).select do |date| 
  date.saturday? || date.sunday? 
end # => [Sat, 03 Sep 2016, Sun, 04 Sep 2016, Sat, 10 Sep 2016, ...

这将为您提供104个元素的数组,其中包含每个日期,即当天和今天之间的星期六或星期日。

答案 2 :(得分:0)

以下方法强调效率而不是简洁,避免需要确定某一范围内的每一天是否是一周中的某一天(或两天中的一天)。

代码

require 'date'

def dates_by_years_and_wday(start_year, end_year, wday)
  (first_date_by_year_and_wday(start_year, wday)...
   first_date_by_year_and_wday(end_year+1, wday)).step(7).to_a
end

def first_date_by_year_and_wday(year, wday)
   d = Date.new(year)
   d + (wday >= d.wday ? wday - d.wday : 7 + wday - d.wday)
end

请注意,范围是用三个点定义的,这意味着end_year中的第一个日期被排除。

实施例

SATURDAY = 6
SUNDAY = 0
start_year, end_year = 2015, 2017

dates_by_years_and_wday(start_year, end_year, SATURDAY)
  #=> [#<Date: 2015-01-03 ((2457026j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2015-01-10 ((2457033j,0s,0n),+0s,2299161j)>,
  #    ...   
  #    #<Date: 2017-12-30 ((2458118j,0s,0n),+0s,2299161j)>]
dates_by_years_and_wday(start_year, end_year, SATURDAY).size
  #=> 157

dates_by_years_and_wday(start_year, end_year, SUNDAY)
  #=> [#<Date: 2015-01-04 ((2457027j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2015-01-11 ((2457034j,0s,0n),+0s,2299161j)>,
  #    ...   
  #    #<Date: 2017-12-31 ((2458119j,0s,0n),+0s,2299161j)>]    
dates_by_years_and_wday(start_year, end_year, SUNDAY).size
  #=> 157