48

フォームから入力される Ruby DateTime があります。さらに、フォームから n 時間もかかります。これらの n 時間を前の DateTime から減算したいと思います。(時間範囲を取得するため)。

DateTime には、日と月を減算する "-" と "<<" の 2 つのメソッドがありますが、時間は減算できません。( API )。どうすればそれを行うことができますか?

4

11 に答える 11

61

あなたはこれを行うことができます。

adjusted_datetime = (datetime_from_form.to_time - n.hours).to_datetime
于 2008-10-27T04:57:57.993 に答える
38

1日未満を差し引くことができます:

two_hours_ago = DateTime.now - (2/24.0)

これは数分間、その他何でも機能します。

hours = 10
minutes = 5
seconds = 64

hours = DateTime.now - (hours/24.0) #<DateTime: 2015-03-11T07:27:17+02:00 ((2457093j,19637s,608393383n),+7200s,2299161j)>
minutes = DateTime.now - (minutes/1440.0) #<DateTime: 2015-03-11T17:22:17+02:00 ((2457093j,55337s,614303598n),+7200s,2299161j)>
seconds = DateTime.now - (seconds/86400.0) #<DateTime: 2015-03-11T17:26:14+02:00 ((2457093j,55574s,785701811n),+7200s,2299161j)>

浮動小数点演算の不正確さが問題になる場合は、Rationalまたはその他の安全な算術ユーティリティを使用できます。

于 2008-12-05T13:40:17.163 に答える
21

このような動作をより明確にしたい場合は、advance メソッドが便利です。

adjusted = time_from_form.advance(:hours => -n)
于 2011-05-16T00:14:49.373 に答える
19

1日の一部を離陸するだけです。

two_hours_ago = DateTime.now - (2.0/24)
  • 1.0 = 1 日
  • 1.0/24 = 1 時間
  • 1.0/(24*60) = 1 分
  • 1.0/(24*60*60) = 1 秒
于 2015-07-16T07:03:04.603 に答える
12

n/24.0フロートは最終的に丸められるため、トリックは正しく機能しません。

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),1.0/24){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T03:59:59+00:00
2009-06-04T04:59:59+00:00

ただし、代わりに Rational クラスを使用できます。

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),Rational(1,24)){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T04:00:00+00:00
2009-06-04T05:00:00+00:00
于 2009-08-13T20:30:53.163 に答える
6

Railsで作業している場合、次の超直感的な可能性が存在します。

> Time.now - 12.hours
=> 2019-08-19 05:50:43 +0200

(これはでも機能します)

Rubyだけを使用している場合、DateTimeこれはできませんが、次のことがTimeできます。

t = Time.now
t = t - (hours*60**2)

Time日付情報も保存されることに注意してください。これはすべて少し奇妙です。

一緒に仕事をしなければならない場合DateTime

DateTime.commercial(date.year,date.month,date.day,date.hour-x,date.minute,date.second)

うまくいくかもしれませんが、醜いです。ドキュメントDateTimeは不変だと言っているので-<<

于 2008-10-26T21:52:36.947 に答える
5

取得した値をどのように使用する必要があるかについては言及していませんが、時間を 24 で割って 1 日の端数を差し引くのはどうでしょうか。

mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0
于 2008-10-27T00:00:23.333 に答える
4

Time代わりに使用することが許可されている場合DateTime(あるものを別のものに変換するにはいくつかの方法があります):

# Just remove the number of seconds from the Time object
Time.now - (6 * 60 * 60) # 6 hours ago
于 2014-08-14T14:52:23.043 に答える
4

編集:ここで概説したアプローチを使用することを決定する前に、この質問を見てください。Ruby で基本クラスの動作を変更するのはベスト プラクティスではないようです (これは理解できます)。だから、この答えを一粒の塩で受け取ってください...


MattW の答えは私が最初に考えたものでしたが、あまり好きではありませんでした。

DateTimeパッチを当ててFixnum、やりたいことをすることで、見苦しさを軽減できると思います。

require 'date'

# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.

class Hours
   attr_reader :value

   def initialize(value)
      @value = value
   end
end

# Patch the #-() method to handle subtracting hours
# in addition to what it normally does

class DateTime

   alias old_subtract -

   def -(x) 
      case x
        when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
        else;       return self.old_subtract(x)
      end
   end

end

# Add an #hours attribute to Fixnum that returns an Hours object. 
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example

class Fixnum
   def hours
      Hours.new(self)
   end
end

次に、次のようにコードを記述できます。

some_date = some_date - n.hours

減算する時間数はどこnですかsome_date

于 2008-10-26T22:27:21.870 に答える
2

active_supportでヘルパーを使用するのが好きです。それはそれを本当にきれいにして読みやすくします。

以下の例を参照してください。

require 'active_support'

last_accessed = 2.hours.ago
last_accessed = 2.weeks.ago
last_accessed = 1.days.ago

現在の日付が使用されている場合は、そのような構文を使用して、探していることを実行する方法があるかもしれません。

于 2008-10-30T21:22:45.757 に答える
-3

あなたはこれを使うことができます:

Time.now.ago(n*60*60)

たとえばTime.now.ago(7200)、今から2時間前の日付と時刻を指定します。

于 2011-12-20T11:00:53.443 に答える