Ответ, вдохновленный тем, что Лев Лукомский использует 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: Duration.