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

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

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時間の差は秒を返すため、で割る必要があります。

于 2012-06-18T22:05:14.223 に答える
4

Range#size, tryのようなメソッドはありません(Andrew Marshall によって提案されているように) が、オブジェクト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"]
于 2012-06-18T22:14:12.960 に答える