循环任务中的无限循环迭代ActiveSupport日期范围

时间:2012-07-23 14:25:43

标签: ruby-on-rails rake activesupport

我的rake任务挂在无限循环中有问题。到目前为止,我已经能够将问题分离为将日期范围转换为数组的代码。即使我直接调用它:

(1.month.ago.beginning_of_month..1.month.ago.end_of_month).to_a.each {|d| p d}

任务挂起永远迭代相同的元素:

"2012-06-01 00:40:41 UTC"
"2012-06-01 00:40:41 UTC"
"2012-06-01 00:40:41 UTC"
"2012-06-01 00:40:41 UTC"
"2012-05-31 20:40:41 UTC"
"2012-05-31 20:40:41 UTC"
"2012-06-01 00:40:42 UTC"
"2012-06-01 00:40:42 UTC"
"2012-06-01 00:40:42 UTC"
"2012-06-01 00:40:42 UTC"
"2012-05-31 20:40:42 UTC"
"2012-05-31 20:40:42 UTC"
...

如果我使用此

(Date.new(2012,6,1)..Date.new(2012,6,30)).to_a.each {|d| p d}

一切正常,因此必须特别使用日期/时间的ActiveSupport扩展。有没有人见过这个?

如果这很重要,这种情况会发生在使用Rails 3.1和Ruby 1.9.3的Windows机器上的开发环境中。

2 个答案:

答案 0 :(得分:3)

您正在创建一个月的Time范围,增量为1秒,条目数量约为250万:

(1.month.ago.beginning_of_month..1.month.ago.end_of_month)
# => Fri, 01 Jun 2012 00:00:00 CEST +02:00..Sat, 30 Jun 2012 23:59:59 CEST +02:00
1.month.ago.beginning_of_month.succ
# => Fri, 01 Jun 2012 00:00:01 CEST +02:00

要创建Date范围,请使用:

(1.month.ago.beginning_of_month.to_date..1.month.ago.end_of_month.to_date)
# => Fri, 01 Jun 2012..Sat, 30 Jun 2012
1.month.ago.beginning_of_month.to_date.succ
# => Sat, 02 Jun 2012

答案 1 :(得分:1)

使用to_dateActiveSupport::TimeWithZone转换为Date

(1.month.ago.beginning_of_month.to_date..1.month.ago.end_of_month.to_date).
  each do |day| 
    p day
  end

这将在过去一个月内重复几天。

问题似乎是在succ上使用ActiveSupport::TimeWithZone方法,这会引发Time#succ is obsolete警告。