3

我如何能够获得由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

用户/.../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

4

3 回答 3

4

这是因为日期范围的大小没有意义——它不知道您是否要将其视为天、分、秒、月或其他形式。错误提到迭代的原因是,为了确定范围的大小,它必须知道如何迭代它们,以便它可以计算元素的数量。

由于您想要的是天数的差异,因此请执行以下操作:

date_one = Time.now.end_of_day - 31.days
date_two = Time.now.end_of_day - 1.day

((date_one - date_two) / 1.day).abs
#=> 30.0

您必须除以,1.day因为 Times 的差异返回秒。

于 2012-06-18T22:05:14.223 回答
4

没有像Range#size, try这样的方法Range#count(正如 Andrew Marshall 所建议的那样),尽管它仍然不适用于一系列Time对象。

如果你想执行天数计算,你最好使用Date对象,或者直接实例化它们(Date.today - 31例如),或者调用#to_date你的Time对象。

Date对象也可以用于迭代:

((Date.today - 2)..(Date.today)).to_a
=> [#<Date: 2012-06-17 ((2456096j,0s,0n),+0s,2299161j)>,
 #<Date: 2012-06-18 ((2456097j,0s,0n),+0s,2299161j)>,
 #<Date: 2012-06-19 ((2456098j,0s,0n),+0s,2299161j)>]

((Date.today - 2)..(Date.today)).map(&:to_s)
=> ["2012-06-17", "2012-06-18", "2012-06-19"]
于 2012-06-18T22:14:12.960 回答
0

为了让您的代码有任何机会工作,您应该将 .size 之前的所有内容都用括号括起来。

而不是使用范围,也许你可以从另一个对象中减去一个时间对象?

我知道您使用 Date 对象制作范围,因此您可以转换为该范围。

于 2012-06-18T21:56:03.367 回答