获取由 Time 对象组成的 ruby​​ 范围中的元素数量

Vic*_*r S 4 ruby time range

我如何才能获得由Time对象组成的范围的大小或数量?

可以实现与我的伪 Ruby 代码相同的结果,但它不起作用:

((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).size == 30
Run Code Online (Sandbox Code Playgroud)

目前执行上述操作会出现错误:

NoMethodError:2012-05-18 23:59:59 -0400..2012-06-17 23:59:59 -0400:Range 未定义方法“size”

并尝试将其转换为数组(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

Lar*_*eth 5

没有像Range#size“尝试”这样的方法Range#count(如安德鲁·马歇尔建议的那样),尽管它仍然不适用于一系列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"]
Run Code Online (Sandbox Code Playgroud)