web-dev-qa-db-ja.com

Rails-時、分、秒の時差を取得する

特定の日付から時、分、秒で経過した時間を取得するための慣用的な方法を探しています。

指定された日付が2013-10-25 23:55:00で、現在の日付が2013-10-27 20:55:09である場合、戻り値は45:03:09になります。 time_difference および time_diff gemは、この要件では機能しません。

25
anon

これで試すことができます:

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

  hours = seconds_diff / 3600
  seconds_diff -= hours * 3600

  minutes = seconds_diff / 60
  seconds_diff -= minutes * 60

  seconds = seconds_diff

  "#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}"
  # or, as hagello suggested in the comments:
  # '%02d:%02d:%02d' % [hours, minutes, seconds]
end

そしてそれを使用します:

time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
38
MrYoshiji
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"

または、アプリで丸めが難しい場合は、to_iを置き換えて丸めます。

  Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
   => => "00:02:00"

慣用的な部分についてはわからない

更新:時差が24時間を超えると予想される場合、上記のコードは正しくありません。そのような場合は、@ MrYoshijiの回答に従うか、上記のソリューションを調整して、日時オブジェクトから時間を手動で計算できます。

def test_time time_diff
  time_diff = time_diff.round.abs
  hours = time_diff / 3600

  dt = DateTime.strptime(time_diff.to_s, '%s').utc
  "#{hours}:#{dt.strftime "%M:%S"}"
end

test_time Time.now - 28.hours.ago - 2.minutes - 12.seconds
=> "27:57:48" 
test_time Time.now - 8.hours.ago - 2.minutes - 12.seconds
=> "7:57:48" 
test_time Time.now - 24.hours.ago - 2.minutes - 12.seconds
=> "23:57:48" 
test_time Time.now - 25.hours.ago - 2.minutes - 12.seconds
=> "24:57:48" 
28
Tumas

そのための方法があります:

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

10に等しい(実際、9.99 ...、10が必要な場合は.roundを使用)。

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

お役に立てば幸いです。

7
Francois

見る

270921secを日+時間+分+秒に変換する方法(Ruby)

これはあなたの質問と非常によく似ており、秒単位の違いから始まります

4
Danny