フレデリックの回答が提供するものに加えて、日付に8640000を追加することは、時間に8640000を追加することと同じではなく、100.days
100日の正しい指定でもありません。
100.days
「この値は日数を表す」ではなく、「100 日の秒数を教えてください」という意味を考えてください。Rails は以前は秒数を返していましたが、凝った/よりスマートになり、それを期間に変更して、日付の計算が正しいことを行うことができるようにしました。そのより洗練された/よりスマートなことは、実際に何が起こっているのかをマスクすることによって遭遇したような問題を引き起こし、あなたが知るまでデバッグを困難にします.
日付の計算では、秒ではなく日の値が想定されますが、時間では秒が必要です。したがって、次の操作を行い100 * 24 * 60 * 60 = 8640000
ます。
100 * 24 * 60 * 60 => 8640000
date = Date.parse('31 Oct 2012') => Wed, 31 Oct 2012
time = Time.new(2012, 10, 31) => 2012-10-31 00:00:00 -0700
date + 8640000 => Mon, 07 May 25668
time + 8640000 => 2013-02-08 00:00:00 -0700
date + 100 => Fri, 08 Feb 2013
時間と日付を扱うのは面倒な場合があり、書いたコードの忘れた場所でバグに遭遇することは間違いありません。ActiveSupport::Duration 部分は、日付/時刻オフセットの一部を処理することで役立ちます。最善の戦術は、Date/DateTime または Time のいずれかを使用し、どうしても必要な場合を除き、それらを混在させないことです。それらを混在させる必要がある場合は、コードをメソッドにボトルネックさせて、問題が発生した場合に調べる場所を 1 か所にします。
Time が処理できるよりも大きな範囲を処理する必要がある場合は、Date と DateTime を使用します。また、DateTime には他にも便利な機能がいくつかあります。それ以外の場合は、OS と C により密接に結合されているので Time を使用します (そして、そこに私のルーツのいくつかを明らかにしました。 )