Have you ever wanted something like distance_of_time_in_words
that gave the precise amount of a time duration instead of just a round approximation like 'over 3 years'
?
Introducing ActiveSupport::Duration#human_string
, which converts ActiveSupport::Duration
objects into human-friendly strings like '3y 6m 4d 12h 30m 5s'
.
Usage examples
duration = 3500.seconds
duration.human_str # => '58m 20s'
duration.human_str(delimiter: '') # => '58m20s'
duration.human_str(separator: ' ') # => '58 m 20 s'
duration.human_str(delimiter: ', ', separator: ' ') # => '58 m, 20 s'
duration = ActiveSupport::Duration.parse "P3Y6M4DT12H30M5S"
# => 3 years, 6 months, 4 days, 12 hours, 30 minutes, and 5 seconds
duration.human_str # => "3y 6m 4d 12h 30m 5s"
(duration - 4.days).human_str # => "3y 6m 12h 30m 5s"
duration.human_str(delimiter: ', ') # => "3y, 6m, 4d, 12h, 30m, 5s"
Similar methods
- Like
distance_of_time_in_words
helper but exact rather than approximate-
distance_of_time_in_words
is somewhat configurable but only gives an approximation ('over 3 years'
), with no option to print the exact number of each units.
-
- Like
#inspect
but more concise and configurable.-
#inspect
is long ('3 years, 6 months, 4 days, 12 hours, 30 minutes, and 5 seconds'
) and not
at all configurable.
-
- Like
#iso8601
but more human readable rather than machine readable.-
#iso8601
is concise and machine-readable, but not very human-readable ('P3Y6M4DT12H30M5S'
)!
-
- Unlike
#to_s
, which is very concise ('110839937'
) but not at all human-readable for large durations