【问题标题】:RoR, Can't iterate from DateTime/TimeWithZoneRoR,无法从 DateTime/TimeWithZone 进行迭代
【发布时间】:2014-03-11 18:24:51
【问题描述】:

我有一个简单的任务,我想获取开始日期和结束日期,然后循环查看日期/日期。此代码正在我的 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 有任何线索,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby datetime seeding


    【解决方案1】:
    start = someModel.start_date.to_datetime
    finish = someModel.end_date.to_datetime
    while(start < finish) do
      #bunch of awesome stuff
      start += 1.day
    end
    

    【讨论】:

    • 感谢克里斯的回答。我不得不有点挣扎,然后我读到日期是不可变的,我正在路上。
    • 你明白了,伙计。祝你好运。
    【解决方案2】:

    您必须确保您正在处理一个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
    

    【讨论】:

      【解决方案3】:

      您不能从 DateTime 进行迭代。但是您可以在开始和结束时进行迭代 间隔是Date 的实例。如果可能,请转换它们。

      然后看看这些Date方法:

      使用而不是each

      【讨论】:

        【解决方案4】:

        如果您想在范围上进行迭代,您可以考虑使用类似someModel.start_date + 1.day.to_i 的方式每天循环和步进

        【讨论】:

          【解决方案5】:

          这是我们在两个 TimeWithZones 上按分钟迭代的方法:

            # 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-28
            • 1970-01-01
            • 2016-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-26
            • 1970-01-01
            相关资源
            最近更新 更多