32

我有一个简单的任务,我想获取一个开始日期和一个结束日期并循环查看日期/日期。此代码正在我的 db:seed rake 任务中使用。目前,我的代码已经经历了以下尝试。

(someModel.start_date.to_datetime..someModel.end_date.to_datetime).each { 
    |x| puts x 
}
 ......
(someModel.start_date...someModel.end_date).each { |x| puts x }

在每种情况下,我都会收到这样的错误。

can't iterate from ActiveSupport::TimeWithZone
or 
can't iterate from DateTime

如果有人对如何迭代一系列 DateTimes 有任何线索,我将不胜感激。

4

5 回答 5

28
start = someModel.start_date.to_datetime
finish = someModel.end_date.to_datetime
while(start < finish) do
  #bunch of awesome stuff
  start += 1.day
end
于 2014-02-13T04:30:01.727 回答
9

您必须确保您正在处理一个Date对象(通过调用to_date),然后一切都按预期工作:

start_date.to_date.upto(end_date.to_date) {|date| puts date }

或者有一个范围:

(start_date.to_date..end_date.to_date).to_a
于 2016-09-30T09:51:07.100 回答
3

你不能从DateTime. 但是当间隔的开始和结束是Date. 如果可能,请转换它们。

然后看看这些Date方法:

使用而不是each

于 2014-02-13T04:05:05.280 回答
0

如果你想迭代范围,你可以考虑一个循环,每天使用类似的东西someModel.start_date + 1.day.to_i

于 2014-02-13T04:13:19.867 回答
0

下面是我们在两个 TimeWithZone 上按分钟迭代的方法:

  # allow iteration over a set of TimeWithZones
  def self.time_map(range, step: 30.minutes, &block)
    result = []
    time = range.first
    max = range.last
    test = range.exclude_end? ? ->(t) { t < max } : ->(t) { t <= max }
    value = block_given? ? ->(t) { yield(t) } : ->(t) { t }
    while test.call(time) do
      result << value.call(time)
      time += step
    end
    result
  end
于 2021-09-24T19:12:29.863 回答