【发布时间】:2010-03-20 21:59:44
【问题描述】:
CPAN 上是否有任何有用的模块可以返回日期间隔的最大分数,即返回两个日期之间的整数年/月/日/小时/分钟/秒,用于“N 天前”这样的句子或“M 个月前”
【问题讨论】:
标签: perl datetime formatting
CPAN 上是否有任何有用的模块可以返回日期间隔的最大分数,即返回两个日期之间的整数年/月/日/小时/分钟/秒,用于“N 天前”这样的句子或“M 个月前”
【问题讨论】:
标签: perl datetime formatting
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 格式化绝对时间和持续时间。
【讨论】:
DateTime & Co. 只是矫枉过正。我讨厌安装它:D
嗯,写你自己的并不难。
【讨论】:
Time::Duration 似乎是您尝试完成的任务的自然选择。我还没有尝试过。唯一需要注意的是,它已经为您提供了诸如“M 个月前”之类的短语,因此您可能需要将其输出解析为非英语输出。
【讨论】:
您可以看看 CPAN 上的 Time::Ago 模块(我是作者)。它是 Rails 中 time_ago_in_words() 助手的 Perl 端口。
给定一个持续时间,它返回一个可读的字符串近似值。来自 Rails 文档:
0 29 秒 少于一分钟 30 秒 1 分 29 秒 1分钟 1 分 30 秒 44 分 29 秒 [2..44] 分钟 44 分 30 秒 89 分 29 秒 约1小时 89 分 30 秒 23 小时 59 分 29 秒 大约 [2..24] 小时 23 小时 59 分钟 30 秒 41 小时 59 分钟 29 秒 1天 41 小时 59 分钟 30 秒 29 天 23 小时 59 分钟 29 秒 [2..29] 天 29 天 23 小时 59 分钟 30 秒 44 天 23 小时 59 分钟 29 秒 约1个月 44 天 23 小时 59 分钟 30 秒 59 天 23 小时 59 分钟 29 秒 约2个月 59 天 23 小时 59 分钟 30 秒 1 年 - 1 秒 [2..12] 个月 1 年 1 年 3 个月 约1年 1 年、3 个月 1 年、9 个月 1年以上 1 年,9 个月 2 年 - 1 秒 将近2年 最长 2 年时间或日期 (与 1 年相同的规则)【讨论】:
[这不是一个真正的答案,但我认为它是相关的。]
如果您要进行日期/时间操作和计算,最好不要使用 DateTime 系列模块。他们不仅拥有我发现的最佳时区处理能力,而且它们都可以相互协作。我在这个领域从来没有遇到过我在 DateTime 中找不到模块来解决它的问题。
【讨论】: