2011-07-14 30 views
2

我想为Template :: Toolkit模板提供一个整数。该整数表示经过的秒数。在perl的模板工具包中显示时间增量

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

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之外进行格式设置吗?

感谢

回答

1

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

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

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

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 %] 
0

您也可以使用任何模块进行日期和时间计算。 要么像上面显示的define_vmethod,要么只是将Time计算类的实例赋给TT存储,并在模板中直接使用它的方法。

实施例:

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