今後20分と10秒のDateTimeインスタンスを作成したいと考えています。 私はirbでTimeとDateTimeを試しましたが、本当に理にかなった方法を見つけ出すことはできません。 DateTimeオブジェクトには日を追加するだけで、Timeオブジェクトには秒を追加することしかできません。ルビーの時間操作
いつも秒に追加したい時間を変換するよりも良い方法はありませんか?
今後20分と10秒のDateTimeインスタンスを作成したいと考えています。 私はirbでTimeとDateTimeを試しましたが、本当に理にかなった方法を見つけ出すことはできません。 DateTimeオブジェクトには日を追加するだけで、Timeオブジェクトには秒を追加することしかできません。ルビーの時間操作
いつも秒に追加したい時間を変換するよりも良い方法はありませんか?
Time
は秒数です一方、DateTime
は、DateTime
に1
を追加すると1日が足りるエポック以降の日数です。ただし(86400秒は一日であるので)d
に10秒を追加する例
d = DateTime.now
d + Rational(10, 86400)
のために、一日の分画を追加することができます。
あなたがRailsのを使用している場合は、activesupportのは、いくつかのヘルパーメソッドを追加し、あなたは正しいことを行います
d + 20.minutes + 10.seconds
が
d
が
DateTime
か
Time
です行うことができます。あなたはActiveSupportを単独で使用することができ、最近あなたが必要とするビットだけを引き込むことができます。私はこの物が
activesupport/duration
にあることを思い出しているようです。私はタイムハンドリングにも役立ついくつかの宝石があると信じています。
まあ、インターフェースはシンプルで簡単です:あなたが便利な何かを持っているしたい場合は、Time
クラスにメソッドを追加することができ
t = Time.now
t + (20 * 60 + 10)
:
class Time
def add_minutes(m)
self + (60 * m)
end
end
しかし、私は考えていませんこれは簡単です:
t = Time.now
t.add_minutes(20) + 10
OPは時間ではなくDateTimeを要求します。 – steenslag
あなたがActiveSupportを必要としているか、Railsプロジェクトで作業していると仮定します。ルビーでこれを行うには非常に単純な読みやすい方法は、次のとおりです。
DateTime + 5.minutes
Time + 5.minutes
はまた、単にアクティブサポートの時間拡張を使用.seconds, .hours, .days, .weeks, .month, .years
これは、ActiveSupportまたはRailsを使用していることを前提としています。 –
情報のおかげで - これはルビーの標準的な動作だと思った – alex
で動作します。彼らは手でこれをしようとするよりも、非常に便利で、エラーが起こりにくいです。
# gem 'activesupport'
require 'active_support/core_ext/numeric/time.rb'
DateTime.now + 20.minutes
NB:はい、これはサードパーティのライブラリから離れて滞在のStackOverflowのパーティーラインに反するが、彼らはしているときにライブラリを使用して避けてはならないあなたが必要とするだけのモジュールをインポートすることができますリスクを大幅に削減し、コードの明快さを向上させます。
個人的には、実行時に明らかに非常にわずかに遅くなっても、マジックナンバーがどこから来たのかをもう少し明白にするために '60 * 60 * 24'を書き出すことを好みます。 –
@AndrewMarshall合意し、何百万回もこの 'DateTime'操作を何百万回も実行しない限り、さらに2回の乗算操作はマイクロ最適化*に値しません。あなたがパフォーマンス上の問題にぶつかるまで、それについて考えることさえしないでください。コードの初めに定数を宣言するのはどうでしょう? 'SECONDS_PER_DAY = 60 * 60 * 24'を使用してください。 'MINUTERS_PER_DAY = 60 * 24'と' HOURS_PER_DAY = 24'でも同じことができますが、最後のものは必要ではないかもしれませんが、一貫性があり、それらをすべてリストするだけで良いです。 –