Time::Ago - Approximate duration in words
version 1.00
use Time::Ago; print Time::Ago->in_words(0), "\n"; # prints "less than a minute" print Time::Ago->in_words(3600 * 4.6), "\n"; # prints "about 5 hours" print Time::Ago->in_words(86400 * 360 * 2), "\n"; # prints "almost 2 years" print Time::Ago->in_words(86400 * 365 * 11.3), "\n"; # prints "over 11 years"
Given a duration, in seconds, returns a readable approximation. This a Perl port of the time_ago_in_words() helper from Rails.
From Rails' docs:
0 <-> 29 secs less than a minute 30 secs <-> 1 min, 29 secs 1 minute 1 min, 30 secs <-> 44 mins, 29 secs [2..44] minutes 44 mins, 30 secs <-> 89 mins, 29 secs about 1 hour 89 mins, 30 secs <-> 23 hrs, 59 mins, 29 secs about [2..24] hours 23 hrs, 59 mins, 30 secs <-> 41 hrs, 59 mins, 29 secs 1 day 41 hrs, 59 mins, 30 secs <-> 29 days, 23 hrs, 59 mins, 29 secs [2..29] days 29 days, 23 hrs, 59 mins, 30 secs <-> 44 days, 23 hrs, 59 mins, 29 secs about 1 month 44 days, 23 hrs, 59 mins, 30 secs <-> 59 days, 23 hrs, 59 mins, 29 secs about 2 months 59 days, 23 hrs, 59 mins, 30 secs <-> 1 yr minus 1 sec [2..12] months 1 yr <-> 1 yr, 3 months about 1 year 1 yr, 3 months <-> 1 yr, 9 months over 1 year 1 yr, 9 months <-> 2 yr minus 1 sec almost 2 years 2 yrs <-> max time or date (same rules as 1 yr)
Time::Ago->in_words(30); # returns "1 minute" Time::Ago->in_words(3600 * 24 * 365 * 10); # returns "about 10 years"
Given a duration, in seconds, returns a readable approximation in words.
If an include_seconds parameter is supplied, durations under one minute generate more granular phrases:
foreach (4, 9, 19, 39, 59) { print Time::Ago->in_words($_, include_seconds => 1), "\n"; } # less than 5 seconds # less than 10 seconds # less than 20 seconds # half a minute # less than a minute
As a convenience, if the duration is an object with an epoch() interface (as provided by Time::Piece or DateTime), the current time minus the object's epoch() seconds is used.
Passing the duration as a DateTime::Duration instance is also supported.
Locale::TextDomain is used for localization.
Currently Arabic, Dutch, English, French, German, Italian, Japanese, Russian, and Spanish translations are available. Contact me if you need another language.
See Locale::TextDomain for how to specify a language.
#!/usr/bin/env perl use strict; use warnings; use open qw/ :std :utf8 /; use POSIX ':locale_h'; use Time::Ago; my $secs = 86400 * 365 * 10.4; foreach (qw/ en fr de it ja ru es /) { setlocale(LC_ALL, ''); $ENV{LANGUAGE} = $_; print Time::Ago->in_words($secs), "\n"; }
Output:
over 10 years plus de 10 ans vor mehr als 10 Jahren oltre 10 anni 10年以上 больше 10 лет más de 10 años
The rails' implementation includes some logic for leap years that is not implemented here.
Ruby on Rails DateHelper http://apidock.com/rails/v4.2.1/ActionView/Helpers/DateHelper/distance_of_time_in_words
Ruby i18n library https://github.com/svenfuchs/i18n
Github repository https://github.com/mla/time-ago
Time::Duration, DateTime::Format::Human::Duration, Locale::TextDomain
Maurice Aubrey <maurice.aubrey@gmail.com>
This software is copyright (c) 2017 by Maurice Aubrey.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install Time::Ago, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Time::Ago
CPAN shell
perl -MCPAN -e shell install Time::Ago
For more information on module installation, please visit the detailed CPAN module installation guide.