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_wordshelper but exact rather than approximate-
distance_of_time_in_wordsis somewhat configurable but only gives an approximation ('over 3 years'), with no option to print the exact number of each units.
-
- Like
#inspectbut more concise and configurable.-
#inspectis long ('3 years, 6 months, 4 days, 12 hours, 30 minutes, and 5 seconds') and not
at all configurable.
-
- Like
#iso8601but more human readable rather than machine readable.-
#iso8601is 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