在Ruby中两个日期之间获取Date对象数组的最有效方法是什么?

时间:2014-12-25 17:38:28

标签: ruby-on-rails ruby date

所以我有两个约会

date_start = Date("2014", "11", "1")
date_stop = Date("2014", "12", "25")

如果我想在这两个日期之间有一组Date个对象,那么最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

日期之间的1.day间隔:

(date1..date2).to_a

对于其他时间间隔,您必须自己填充数组。

interval = 2.days

[date1].tap do |arr|
  until (arr.last >= date2)
    new_date = arr.last + interval

    # case 1: if you want the array to end on date2:
    arr << [new_date, date2].min

    # case 2: if you want the array to be equally spaced:
    arr << new_date

    # case 3: if you want the array to be equally spaced,
    #         but values to be within date1 and date2:
    if (new_date <= date2)
      arr << new_date
    else
      break
    end
  end
end

通常,您可以在范围上使用step方法来指定间隔;但不是在这种情况下。例如,以下内容无法按预期工作:

(date1..date2).step(2.days).to_a # outputs: [date1]

答案 1 :(得分:1)

正如@Humza所说,您应该使用Ranges来解决您的问题。你能够:

  • 使用.....
  • 包含或排除最后一个值
  • 使用.step(YOUR_STEP)
  • 定义您想要的步骤

有一个例子:

require 'date'

date_start = Date.new(2014, 11, 1)
date_stop  = Date.new(2014, 11, 6)

including_last_date = (date_start..date_stop).step(5).to_a
excluding_last_date = (date_start...date_stop).step(5).to_a

puts "INCLUDING : #{including_last_date.map(&:to_s)}" # INCLUDING : ["2014-11-01", "2014-11-06"]
puts "EXCLUDING : #{excluding_last_date.map(&:to_s)}" # EXCLUDING : ["2014-11-01"]

我希望这有帮助!