2012-04-07 14 views
21

今後20分と10秒のDateTimeインスタンスを作成したいと考えています。 私はirbでTimeとDateTimeを試しましたが、本当に理にかなった方法を見つけ出すことはできません。 DateTimeオブジェクトには日を追加するだけで、Timeオブジェクトには秒を追加することしかできません。ルビーの時間操作

いつも秒に追加したい時間を変換するよりも良い方法はありませんか?

答えて

46

Timeは秒数です一方、DateTimeは、DateTime1を追加すると1日が足りるエポック以降の日数です。ただし(86400秒は一日であるので)dに10秒を追加する例

d = DateTime.now 
d + Rational(10, 86400) 

のために、一日の分画を追加することができます。

あなたがRailsのを使用している場合は、activesupportのは、いくつかのヘルパーメソッドを追加し、あなたは正しいことを行います

d + 20.minutes + 10.seconds 

dDateTimeTimeです行うことができます。あなたはActiveSupportを単独で使用することができ、最近あなたが必要とするビットだけを引き込むことができます。私はこの物が activesupport/durationにあることを思い出しているようです。私はタイムハンドリングにも役立ついくつかの宝石があると信じています。

+5

個人的には、実行時に明らかに非常にわずかに遅くなっても、マジックナンバーがどこから来たのかをもう少し明白にするために '60 * 60 * 24'を書き出すことを好みます。 –

+0

@AndrewMarshall合意し、何百万回もこの 'DateTime'操作を何百万回も実行しない限り、さらに2回の乗算操作はマイクロ最適化*に値しません。あなたがパフォーマンス上の問題にぶつかるまで、それについて考えることさえしないでください。コードの初めに定数を宣言するのはどうでしょう? 'SECONDS_PER_DAY = 60 * 60 * 24'を使用してください。 'MINUTERS_PER_DAY = 60 * 24'と' HOURS_PER_DAY = 24'でも同じことができますが、最後のものは必要ではないかもしれませんが、一貫性があり、それらをすべてリストするだけで良いです。 –

2

まあ、インターフェースはシンプルで簡単です:あなたが便利な何かを持っているしたい場合は、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 
+4

OPは時間ではなくDateTimeを要求します。 – steenslag

2

あなたがActiveSupportを必要としているか、Railsプロジェクトで作業していると仮定します。ルビーでこれを行うには非常に単純な読みやすい方法は、次のとおりです。

DateTime + 5.minutes 
Time + 5.minutes 

はまた、単にアクティブサポートの時間拡張を使用.seconds, .hours, .days, .weeks, .month, .years

+16

これは、ActiveSupportまたはRailsを使用していることを前提としています。 –

+0

情報のおかげで - これはルビーの標準的な動作だと思った – alex

2

で動作します。彼らは手でこれをしようとするよりも、非常に便利で、エラーが起こりにくいです。

# gem 'activesupport' 
require 'active_support/core_ext/numeric/time.rb' 
DateTime.now + 20.minutes 

NB:はい、これはサードパーティのライブラリから離れて滞在のStackOverflowのパーティーラインに反するが、彼らはしているときにライブラリを使用して避けてはならないあなたが必要とするだけのモジュールをインポートすることができますリスクを大幅に削減し、コードの明快さを向上させます。

関連する問題