从日期数组创建范围

时间:2014-06-27 16:45:45

标签: ruby arrays date range

我如何简单地使用以下代码,它接受日期数组并返回日期范围数组:

def get_ranges(dates)
  sets = []
  current_set = []
  dates.each do |date|
    if current_set.empty?
      current_set << date
    else
      if current_set.last == date - 1.day
        current_set << date
      else
        sets << current_set
        current_set = [date]
      end
    end

    sets << current_set if date == dates.last
  end

  sets.collect { |set| set.first..set.last }
end

运行以下内容:

dates = [Date.new(2014, 6, 27), Date.new(2014, 6, 28), Date.new(2014, 6, 29), Date.new(2014, 7, 1), Date.new(2014, 7, 3), Date.new(2014, 7, 4), Date.new(2014, 7, 17)] 

puts get_ranges(dates)

产生以下结果:

=> [Fri, 27 Jun 2014..Sun, 29 Jun 2014, Tue, 01 Jul 2014..Tue, 01 Jul 2014, Thu, 03 Jul 2014..Fri, 04 Jul 2014, Thu, 17 Jul 2014..Thu, 17 Jul 2014]

非常感谢帮助。

更新

基本上,结果应该是连续日期范围的数组。

2 个答案:

答案 0 :(得分:1)

你的结果看起来有点奇怪;有些范围可以自己开始和结束。如果您尝试生成一个范围数组,其中每个范围以索引i处的元素开头,并以索引i + 1处的元素结束,这将执行此操作:

 dates.each_cons(2).map { |dates| (dates[0]..dates[1]) }

答案 1 :(得分:0)

这应该有效:

sets = []
current = []
dates.each do |date|
  if current.empty? || date - current.last == 1
    current << date
  else
    sets << current.first..current.last
    current = [date]
  end
end
sets << current.first..current.last

这与你的代码基本相同,但是更清洁......