Rails - 获取小时,分钟和秒的时差

时间:2013-10-25 17:17:53

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-2.0

我正在寻找一种惯用的方式来获取自给定日期以来的时间,以小时,分钟和秒为单位。

如果给定日期是2013-10-25 23:55:00,当前日期是2013-10-27 20:55:09,则返回值应为45:03:09。 time_differencetime_diff宝石无法满足此要求。

6 个答案:

答案 0 :(得分:37)

你可以试试这个:

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"

答案 1 :(得分:28)

time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"

或者如果你的应用程序对于舍入很挑剔,只需将to_i替换为round:

  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" 

答案 2 :(得分:7)

有一种方法:

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

等于10(事实上,9.99 ......如果你想要10),请使用.round

来源:http://apidock.com/rails/Time/minus_with_coercion

希望我帮助过。

答案 3 :(得分:4)

看看

how to convert 270921sec into days + hours + minutes + sec ? (ruby)

这与你的问题非常相似,只是从秒的差异开始

答案 4 :(得分:0)

由于尚未将其标记为重复,因此the response in the main thread更加清晰,恕我直言。我将其添加到此处以提高可见性:

可以使用divmod非常简洁地完成此操作:

t = (end_time - start_time).round.abs
mm, ss = t.divmod(60)
hh, mm = mm.divmod(60)
puts "%02d:%02d:%02d" % [hh, mm, ss]

您可以通过使用collectinject来发挥创造力来进一步干燥,但是当核心逻辑是三行时,这可能会显得过份。

请注意,我对答案做了一些更改,以更好地适合该主题的问题。

答案 5 :(得分:-1)

一旦您获得以秒为单位的时差,就可以执行以下操作

Time.at(t).utc.strftime("%H:%M:%S")

t是时差,以秒为单位