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

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

如果给定日期是2013-10-25 23:55:00,当前日期是2013-10-27 20:55:09,则返回值应为45:03:09。 time_difference和time_diff gems不适用于此要求。

你可以尝试这个:

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" 
 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" 

有一种方法:

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

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

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

希望我帮忙。

看着

如何将270921sec转换为天+小时+分钟+秒? (ruby)

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