【发布时间】:2012-06-20 22:34:55
【问题描述】:
如何获得由Time 对象组成的范围的大小或计数?
可以实现与我的伪 Ruby 代码相同的结果,但它不起作用:
((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).size == 30
当前执行上述操作会出错:
NoMethodError: 2012-05-18 23:59:59 -0400..2012-06-17 23:59:59 -0400:Range 的未定义方法“大小”
并试图把它变成数组(range).to_a:
无法从时间迭代
更新
有趣,刚刚尝试做
((Date.today.end_of_day - 31.days)..(Date.today.end_of_day - 1.day)).count
Users/.../gems/ruby/1.9.1/gems/activesupport-3.0.15/lib/active_support/time_with_zone.rb:322:警告:Time#succ 已过时;使用时间+1
然而
((Date.today - 31.days)..(Date.today - 1.day)).count == 31
我愿意接受吗?
还有((Date.today - 31.days)..(Date.yesterday)).count == 31
更新 2
另一方面,根据 Mu 的提示,我们可以这样做:
(((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).first.to_date..((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).last.to_date).count == 31
【问题讨论】:
-
您打算实现什么?您的代码点中的
.size表示您想要该范围将提供的元素数量,但您建议进行迭代。 -
我不建议迭代,红宝石错误建议如此,我想得到我提到的大小/计数。好像有人改了我帖子的标题...
-
另外,你是对的,上面的代码会在 2012-05-18 23:59:59 -0400..2012-06-17 23:59 给出错误
NoMethodError: undefined methodsize': 59 -0400:Range`,我之前做的是(range).to_a,它给出了前面提到的错误,我会更新问题。 -
可能最简单的方法是减去它们,正如 Andrew Marshall 所指出的那样。