在perl的模板工具包中显示时间delta

时间:2011-07-14 11:31:12

标签: perl time template-toolkit

我想为Template :: Toolkit模板提供一个整数。此整数表示经过的秒数。

我想像这样格式化这个数字:

1       => "1 second ago"
2       => "2 seconds ago"
43342   => "12 hours, 2 minutes ago" # ignoring the remaining 42 seconds
4333342 => "1 month, 19 days ago" # ignoring the remaining 17h, 42m & 22s

我找不到这样做的TT插件。

我需要在TT之外进行格式化吗?

由于

3 个答案:

答案 0 :(得分:3)

我不知道任何此类插件,但您可以为标量定义自己的virtual method,这样做:

use Template;
my $tt = Template->new({ ... });

$tt->context->define_vmethod('scalar',
    'duration',
    sub {
        my $seconds = shift;
        # calculate the duration
        return $duration;
    }
);

然后在你的模板中使用它:

Duration: [% var.duration %]

答案 1 :(得分:1)

如果您使用DateTime::Duration来表示持续时间,那么会有一些代码接近。 DateTime::Format::Human::Duration可以完成你所需要的大部分工作,但往往会包含超出你感兴趣的持续时间的其他部分。因为格式化程序是一个对象,就像持续时间一样,两者都可以注入到模板中变量。您也可以直接使用持续时间单位在模板中执行此操作,但这可能是很多逻辑。

Time::Duration确实做了更精确的事情,所以它确实提供了两种单位类型的限制,但没有对象接口,所以你不能直接将它作为变量注入,但它可能是自定义过滤器的良好基础。

如果是我,我将把我需要的函数包装到一个新的格式化类中,它需要你需要的时间,创建一个实例,并将其作为变量注入到模板中。通过这种方式进行单元测试通常更容易。

答案 2 :(得分:0)

您还可以使用任何进行日期和时间计算的模块。 如上所示,可以使用define_vmethod,也可以只将时间计算类的实例分配给TT存储,并在模板中使用其方法。

示例:

#perl
my $tpiece = Time::Piece->new();
$tt->process('my/template.tt', {tpiece=>$tpiece}, \$out);
...
#TT
[% tpiece.add_months(6); %]