【问题标题】:Why doesn't date.format() from Template::Plugin::Date return the duration I expect?为什么来自 Template::Plugin::Date 的 date.format() 不返回我期望的持续时间?
【发布时间】:2016-07-20 23:54:03
【问题描述】:

我尝试使用模板工具包插件Template::Plugin::Date 将持续时间转换为 HH:MM:SS 格式:

[% Use date %]
[% SET tseconds = 478966 %]
[% date.format(tseconds ,'%H:%M:%S') %]

这会返回 13:02:46,但我预计它会返回 133:02:46(478966 秒等于 133 小时 2 分 46 秒)。有没有其他方法可以使用 Template Toolkit 将持续时间(以秒为单位)转换为 HH:MM:SS 格式?

【问题讨论】:

  • date 使用时间戳(不是持续时间),它准确地提供了所提供时间戳 (1970-01-06T13:02:46Z) 的小时、分钟和秒部分。

标签: perl


【解决方案1】:

没有插件可以做到这一点,但您可以编写自己的函数并将其传递到信息哈希中,就像这样

use strict;
use warnings 'all';

use Time::Seconds;
use Template;


my $vars = {
    format_hms => \&format_hms,
};

my $tt = Template->new;

$tt->process(\<<END_TEMPLATE, $vars);
[% SET tseconds = 478966 %]
[% format_hms(tseconds) %]
END_TEMPLATE


sub format_hms {

    my $t = Time::Seconds->new(shift);

    my $h = int $t->hours;
    $t -= $h * ONE_HOUR;

    my $m = int $t->minutes;
    $t -= $m * ONE_MINUTE;

    my $s = int $t->seconds;

    sprintf "%d:%02d:%02d\n", $h, $m, $s;
}

输出

133:02:46



更新

如果您希望通过自定义插件而不是通过在 %vars 哈希中传递子例程引用来使代码可用,这里有一个简单的模块可以让您这样做

package Custom::Template::Plugin::Duration;

use strict;
use warnings 'all';

use base 'Template::Plugin';

use Time::Seconds;


sub format_hms {

    my $self = shift;

    my $t = Time::Seconds->new($_[0]);

    my $h = int $t->hours;
    $t -= $h * ONE_HOUR;

    my $m = int $t->minutes;
    $t -= $m * ONE_MINUTE;

    my $s = int $t->seconds;

    sprintf "%d:%02d:%02d\n", $h, $m, $s;
}

1;

如果您将其另存为Custom/Template/Plugin/Duration.pm@INC 目录之一(当前工作目录是一个不错的选择),那么您可以编写这样的代码

use strict;
use warnings 'all';

use Template;

my $tt = Template->new(
    PLUGINS => {
        duration => 'Custom::Template::Plugin::Duration',
    }
);

$tt->process(\<<END_TEMPLATE);
[% USE duration %]
[% SET tseconds = 478966 %]
[% tseconds %] is equivalent to
[% duration.format_hms(tseconds) %]
END_TEMPLATE

输出

478966 is equivalent to
133:02:46

然而,除了模板访问子例程的方式之外,这里并没有什么本质上的不同。底层代码相同

【讨论】:

  • 感谢您的更新,但我希望在 [% ----- %] 标签中的 .html 文件中完成此操作。另外 [% date.format(tsecond,'%H:%M:%S') %] ,在 24 小时以下工作正常,我也将其测试为 [% date.format(tsecond,'%I:%M :%S') %] 在 %H 的状态下是 %I ----> 24 小时,但是它没有做任何计算并且结果不正确
  • @sailasahoo:我不明白你的问题。我已经向您展示了如何使用模板工具包标记来插入您想要的值,并且我已经解释过没有任何模块可以根据您的需要格式化小时数。唯一的方法是编写自己的函数,使用它的方便方法是在 vars 哈希中传递它。
  • 您好,感谢您的回复。我理解你写的代码和你写的脚本。但我需要在 HTML 中执行此操作。如果 data.format 不起作用,那么我将编写脚本到 javascript 来执行此操作。在 Perl 中,我们可以使用不同的方式,例如 localtime、posix、GMTime 等。但我在 TT 中寻找 HTML 。再次感谢您的帮助。
  • 很抱歉,我仍然不清楚您在做什么。 HTML 不是一种可执行语言,您不能从 JavaScript 调用 Template Toolkit 处理器。你的意思是你可能正在运行tpage?如果你不能以这种方式做事,那么编写一个你自己的小型模板工具包插件来做你想做的事情会很简单。
  • 嗨,这很简单,我正在使用模板工具包从服务器端脚本(perl)调用我的客户端脚本(html)。我希望你不确定我是如何使用这个框架的。无论如何,从 HTML 页面我可以使用 [% %] 并且可以使用 [% USE date %] 。我必须对 HTML 进行一些计算,并将秒数格式化为 H:M:S。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2019-12-30
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多