web-dev-qa-db-ja.com

Ruby on Railsで2つのDateTimes間の秒数を取得する方法

従業員の時間を追跡するコードがあります。これは、従業員に出勤時間を示すカウンターを作成します。

これは現在のコードです:

  start_time = Time.parse(self.settings.first_clock_in)
  total_seconds = Time.now - start_time
  hours = (total_seconds/ 3600).to_i
  minutes = ((total_seconds % 3600) / 60).to_i
  seconds = ((total_seconds % 3600) % 60).to_i

これは正常に機能します。しかし、Timeは1970〜2038の範囲に制限されているため、すべてのTimeの使用をDateTimeに置き換えようとしています。 2つのDateTime間の秒数を取得する方法がわかりません。それらを減算すると、解釈方法がわからないRationalが得られますが、Timesを減算すると秒単位の差が得られます。

注:Ruby 1.9.2であるため、Timeのハード制限は削除されます。ただし、Timeは1823-11-12から2116-02-20までの値に最適化されています。

61
Tilendor

2つのDateTimesを減算すると、経過時間が日数で返されるため、次のようにできます。

elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
77
David Ma

または、より読みやすい:

diff = datetime_1 - datetime_2
diff * 1.days # => difference in seconds; requires Ruby on Rails

あなたや他の検索者が本当に探しているのはこれです:

diff = datetime_1 - datetime_2
Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]
48
Avram Dorfman

to_fを使用してそれらを浮動小数点数に変換できますが、浮動小数点数に関連する通常の精度が失われます。整数秒だけ整数にキャストしている場合は、心配するほど大きくないはずです。

結果は秒単位です。

>> end_time.to_f - start_time.to_f
=> 7.39954495429993

>> (end_time.to_f - start_time.to_f).to_i
=> 7

それ以外の場合は、DateTimeオブジェクトでto_formatted_sを使用して、出力をDecimalクラスが受け入れるものに変換できるかどうかを確認するか、単純なUnix時間を文字列としてフォーマットして呼び出しますto_i.

30
Luke

その他は、分数またはヘルパー関数に誤って依存しています。それよりもはるかに簡単です。 DateTime自体は、整数です。 Ruby方法:

stop.to_i - start.to_i

例:

start = Time.now
 => 2016-06-21 14:55:36 -0700
stop = start + 5.seconds
 => 2016-06-21 14:55:41 -0700
stop.to_i - start.to_i
 => 5
12
Amin Ariana

私はRuby-2.1.4を使用していますが、私にとっては以下がうまくいきました

Time.now - Time.new(2014,11,05,17,30,0)

秒の時間差を教えてくれました

参照: Ruby doc

8
Som Poddar

そのためのメソッドがあります:

Time.now.minus_with_coercion(10.seconds.ago)

10に等しい。

ソース: http://apidock.com/Rails/Time/minus_with_coercion

お役に立てば幸いです。

3
Francois

このようなRuby関数を定義し、

def time_diff(start_time, end_time)
  seconds_diff = (start_time - end_time).to_i.abs

  days = seconds_diff / 86400 
  seconds_diff -= days * 86400

  hours = seconds_diff / 3600  
  seconds_diff -= hours * 3600

  minutes = seconds_diff / 60
  seconds_diff -= minutes * 60

  seconds = seconds_diff

  "#{days} Days #{hours} Hrs #{minutes} Min #{seconds} Sec"
 end

そして、この関数を呼び出して、

time_diff(Time.now, Time.now-4.days-2.hours-1.minutes-53.seconds)
1
ramya

組み込みの「sec」を使用しないのはなぜですか。以下に例を示します。

t1 = Time.now.sec 

elapsed_t = Time.now.sec - t1

puts "it took me :  #{elapsed_t} seconds to do something that is useful \n"
0
zee