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"
Не уверен фразеологические части, хотя
Update: Если разница во время, как ожидается, будет более чем через 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"
Возможный дубликат [как конвертировать 270921сек в дни + часы + минуты + сек? (ruby)] (http://stackoverflow.com/questions/2310197/how-to-convert-270921sec-into-days-hours-minutes-sec-ruby) – maurice