CPAN上是否有任何有用的模块返回日期间隔的最大分数,即两个日期之间的整数年/月/日/小时/分/秒,在“N天前”之类的句子中使用或“M个月前”
答案 0 :(得分:4)
DateTime和DateTime::Duration是最好的模块:
use strict;
use warnings;
use DateTime;
use DateTime::Duration;
use Data::Dumper;
my $dt1 = DateTime->now;
my $dt2 = DateTime->new(
year => 2001,
month => 01,
day => 01
);
my $duration = $dt1 - $dt2;
print Dumper($duration);
产生
$VAR1 = bless( {
'seconds' => 38,
'minutes' => 181,
'end_of_month' => 'wrap',
'nanoseconds' => 0,
'days' => 20,
'months' => 110
}, 'DateTime::Duration' );
您可以使用姐妹模块DateTime::Format和DateTime::Format::Duration格式化绝对时间和持续时间。
答案 1 :(得分:2)
嗯,写自己的并不是很难。
答案 2 :(得分:1)
Time::Duration似乎是您尝试完成的自然选择。我没有尝试过。只有警告似乎它已经为你提供了像“M个月前”这样的短语,所以你可能需要解析它的输出以获得非英语输出。
答案 3 :(得分:1)
您可以查看CPAN上的Time :: Ago模块(我是作者)。它是Rails中time_ago_in_words()帮助器的Perl端口。
给定持续时间,它返回可读的字符串近似值。来自Rails文档:
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)
答案 4 :(得分:0)
[这不是一个真正的答案,但我认为这是相关的。]
如果您要进行日期/时间操作和计算,最好保留DateTime系列模块。他们不仅对我找到的时区进行了最好的处理,而且他们都相互合作。我在这个领域从未遇到任何问题,我在DateTime中找不到解决它的模块。