【问题标题】:Show time delta in perl's template toolkit在 perl 的模板工具包中显示时间增量
【发布时间】:2011-10-05 06:27:26
【问题描述】:

我想为 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 之外进行这种格式化吗?

谢谢

【问题讨论】:

    标签: perl time template-toolkit


    【解决方案1】:

    我不知道任何这样的插件,但您可以为标量定义自己的 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 %]
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您还可以使用任何进行日期和时间计算的模块。 如上所示的 define_vmethod 或者只是将 Time 计算类的实例分配给 TT stash 并直接在模板中使用它的方法。

        例子:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-08
          • 1970-01-01
          • 2011-12-21
          • 1970-01-01
          • 2012-12-23
          • 2013-06-06
          • 2020-12-11
          • 2015-08-01
          相关资源
          最近更新 更多