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)
-
in_words
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 [email protected]
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.