4

Dateオブジェクトが何日前のものかを調べようとしています。

(Date.today - start_time).to_i

私がするとき、私は(Date.today - 30.days.ago.to_date).to_i得る29。考え?

4

1 に答える 1

8

丸めの問題のように聞こえますか?to_i浮動小数点数または有理数を完全に切り捨てるため、丸めには適していません。

したがって、式が 29.999999 を返す場合、これは基本的には 30 ですが、実行to_iすると 29 になります。

代わりにすべきことはround、適切な数学的丸めを行う use です。

(Date.today - 30.days.ago.to_date).round
=> 30

編集

実際、私は間違っていました。その理由は、Railsagoメソッドが現地時間ではなく UTC タイム ゾーンで時間を返すためです。一方Date.today、現地時間に戻るようです。

したがって、運が悪くても、現地時間と UTC 時間の差が午前 0 時を超えると、1 日のオフセットが得られます。

適切な修正は、返された時刻をローカル タイム ゾーンに変換するように呼び出すことですlocaltimeago

30.days.ago
=> Sat, 16 Jun 2012 03:17:44 UTC +00:00

30.days.ago.localtime
=> Sat Jun 16 06:21:47 +0300 2012

(Date.today - 30.days.ago.localtime.to_date).to_i
=> 30
于 2012-07-16T02:41:05.357 に答える