Ответ, вдохновленный тем, что Лев Лукомский использовал в своих интересах ActiveSupport :: Duration и обрабатывает миллисекунды (полезно для тестирования кода)
# duration in ms modulus number of ms in one second
milliseconds = duration.in_milliseconds % 1.second.in_milliseconds
# duration in seconds modulus number of seconds in one minute
seconds = (duration / 1.second) % (1.minute / 1.second)
# duration in minutes modulus number of minutes in one hour
minutes = (duration / 1.minute) % (1.hour / 1.minute)
# duration in hours modulus number of hours in one day
hours = (duration / 1.hour) % (1.day / 1.hour)
format("%02d:%02d:%02d:%03d", hours, minutes, seconds, milliseconds) #=> "12:05:00:001"
Конечно, это можно легко продлить на дни, месяцы, годы,и т.д., используя связанные методы ActiveSupport и повторяя ту же структуру.
Имейте в виду, что для слишком длительных периодов это может быть неточным, так как продолжительность в 1 месяц не фиксирована в количестве дней, и я не уверенкак AS: продолжительность имеет дело с этим.