2011-07-14 58 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); %]