31

20分10秒先のDateTimeインスタンスを作成したいと思います。irbでTimeとDateTimeを試してみましたが、本当に意味のある方法を理解できないようです。DateTimeオブジェクトに日を追加し、Timeオブジェクトに秒を追加することしかできません。

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

4

5 に答える 5

64

ATimeはエポックからの秒数であるのに対し、aDateTimeはエポックからの日数であるため、1aDateTimeに追加すると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。時間の処理にも役立つ宝石が他にもいくつかあると思います。

于 2012-04-07T16:27:22.217 に答える
5

アクティブサポートが必要であるか、Railsプロジェクトで作業していると仮定します。Rubyでこれを行うための非常にシンプルで読みやすい方法は次のとおりです。

DateTime + 5.minutes
Time + 5.minutes

、、、、、、とも連携secondsします。hours_daysweeksmonthsyears

于 2012-04-07T16:27:53.803 に答える
4

ActiveSupportTime拡張機能を使用するだけです。これらは非常に便利で、手動でこれを実行しようとするよりもエラーが発生しにくくなっています。必要なモジュールだけをインポートできます。

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

注意:はい、これはサードパーティのライブラリから離れるというStackOverflowパーティの方針に反しますが、ライブラリが実質的に標準であり、リスクを大幅に軽減し、コードの明確さを向上させる場合は、ライブラリの使用を避けるべきではありません。

于 2017-07-14T12:02:39.003 に答える
1

上記のよう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

これは宝石を追加する必要はありません。

于 2019-11-22T12:09:29.180 に答える
1

純粋なルビー(レールなし)

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

ソース:https ://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/core_ext/numeric/time.rb

于 2020-05-24T16:39:06.787 に答える