0

最近、Timeオブジェクトのインスタンス化(たとえば、Time.nowの使用)と、その値を最終的に整数を返す算術演算に使用することに関するこの奇妙な動作を発見しました。私のユースケースは次のとおりです。

私は時間をインスタンス化します:

time = 3.days.from_now

次に、それを使用して、今からその時間までの秒数を確認します。

now = Time.now
diff = time - now #=> returns an Integer

今、私はその時間をDBに保存します(aがDATETIME列に時間を保存するActiveRecordのようなインスタンスであると仮定しましょう):

a.date = time
a.save

今、それは最もトリッキーな部分になります:

a.reload
time2 = a.date
diff2 = time2 - now #=> returns an Integer
diff == diff2

最後のアサーションは時々偽であり、他は真です。つまり、Timeオブジェクトをインスタンス化すると、Time算術演算に使用されるその値には、最大ナノ秒とマイクロ秒の精度が含まれます。これは、「-」演算の結果の値で考慮されます。ただし、保存されると「マイクロプレシジョン」が残り、データベースに保存されている時間が読み込まれると、ナノ秒やマイクロ秒は発生しません。したがって、以前にそのオブジェクトの属性に割り当てたタイムインスタンスとは本質的に異なります。そして、それは私の差の計算を台無しにします。

したがって、質問は次のようになります。インスタンスが最大数秒の精度で、その時間インスタンスが最終的に保存される場合にdbからフェッチされた時間と同等になるように、Timeからインスタンス化するにはどうすればよいですか?ASの提案も歓迎しますが、ActiveSupportに依存しないソリューションをお勧めします。目標は次のとおりです。diffは常にdiff2と等しくなければなりません。

4

1 に答える 1

1

a を 1 秒に切り詰めるだけでよい場合はTime、次のように使用できます。

t = Time.at(Time.now.to_i)

それ以外のTime.now

Time#round編集:方法に気づいた:

t = Time.now.round

トリックも行う必要があります。

于 2012-10-18T12:30:35.553 に答える