20分10秒先のDateTimeインスタンスを作成したいと思います。irbでTimeとDateTimeを試してみましたが、本当に意味のある方法を理解できないようです。DateTimeオブジェクトに日を追加し、Timeオブジェクトに秒を追加することしかできません。
追加したい時間を常に秒に変換するよりも良い方法はありませんか?
ATime
はエポックからの秒数であるのに対し、aDateTime
はエポックからの日数であるため、1
aDateTime
に追加すると1日が追加されます。ただし、たとえば、1日の端数を追加することはできます
d = DateTime.now
d + Rational(10, 86400)
に10秒が追加されd
ます(1日に86400秒あるため)。
Railsを使用している場合、Active Supportはいくつかのヘルパーメソッドを追加し、次のことができます。
d + 20.minutes + 10.seconds
どちらが正しいことをするかd
は、DateTime
またはTime
です。Active Supportは単独で使用でき、最近では必要な部分だけを取り込むことができます。私はこのようなものがにあることを思い出しているようですactivesupport/duration
。時間の処理にも役立つ宝石が他にもいくつかあると思います。
アクティブサポートが必要であるか、Railsプロジェクトで作業していると仮定します。Rubyでこれを行うための非常にシンプルで読みやすい方法は次のとおりです。
DateTime + 5.minutes
Time + 5.minutes
、、、、、、とも連携seconds
します。hours
_days
weeks
months
years
ActiveSupportTime拡張機能を使用するだけです。これらは非常に便利で、手動でこれを実行しようとするよりもエラーが発生しにくくなっています。必要なモジュールだけをインポートできます。
# gem 'activesupport'
require 'active_support/core_ext/numeric/time.rb'
DateTime.now + 20.minutes
注意:はい、これはサードパーティのライブラリから離れるというStackOverflowパーティの方針に反しますが、ライブラリが実質的に標準であり、リスクを大幅に軽減し、コードの明確さを向上させる場合は、ライブラリの使用を避けるべきではありません。
上記のようseconds
に、Timeオブジェクトに追加できるため、DateTimeオブジェクトを呼び出す場合to_time
は、それに秒を追加できます。
DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M") + 1 => adds a day
(DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M").to_time) +1 => adds a second
これは宝石を追加する必要はありません。
class Numeric
def minutes; self/1440.0 end
alias :minute :minutes
def seconds; self/86400.0 end
alias :second :seconds
end
ここで、1440は分数、86400は1日の秒数です。Railsのやり方に基づいています。
次に、魔法を起こさせることができます:
d + 20.minutes + 10.seconds