【问题标题】:Formatting timestamp field for output in TemplateToolkit为 TemplateToolkit 中的输出格式化时间戳字段
【发布时间】:2013-01-08 15:21:17
【问题描述】:

我将 Perl 与 Catalyst 框架一起使用,DBIx 类作为 ORM,TT 用于视图,Postgresql 作为 DB。

我有一个“没有时区的时间戳”类型的列,如果我在 Postgres 中进行手动查询,列值的格式是 2012-08-30 21:30:14,但是当我在 TT 视图文件中打印值时,我会得到这样的 @ 987654324@,所以很明显它被格式化了,但我不知道具体是什么。

我想使用Template::Plugin::Date 来格式化输出时间戳,但是我得到了 Catalyst 错误:

无法呈现模板“xxx/list.tt2:日期错误 - 错误的时间/日期字符串:需要 'h:m:sd:m:y' 得到:'2012-08-30T21:28:22'”

代码在 xxx/list.tt2 [% date.format(xxx.created) %]

那么我应该如何让它工作呢?提前致谢。

【问题讨论】:

  • 您的时间戳是否被转换为数据库和模板之间的某个对象(然后字符串化)?
  • 嗯,我不确定我能否完全理解时间戳发生了什么,但这里有一些由 Catalyst 在创建 DBIx Schema xxx.pm 时生成的代码:__PACKAGE__->load_components("InflateColumn::DateTime", "TimeStamp");__PACKAGE__->add_columns("created", { data_type => "timestamp", is_nullable => 0 }, ...。除此之外,在我的list 控制器方法中,我只是使用常规 DBIx 合成器获得了一大堆xxx 对象。
  • InflateColumn::DateTime 表明您的时间戳正在转换为 DateTime 实例。您可以直接调用strftime 或使用strftime 方法将其转换为插件可以理解的格式。我最近没有做太多 DBIx、Perl、TT 等,所以我只是抛出一些想法。

标签: perl postgresql catalyst dbix-class template-toolkit


【解决方案1】:

不要使用 Template Tookit 的 Date::Format 功能,它不是很好用。幸运的是,您的 DBIx::Class 对象可以直接调用 strftime。

修复您的代码示例:

[% xxx.created.strftime('%Y-%m-%d %R:%S') %]

对于其他格式,请阅读 strftime 手册页。

如果您需要重复重新格式化,您可能需要使用如下宏:

[% 宏 disp_dt(dt) 块; dt.strftime('%Y: %B %d');结束%]

[% disp_dt(xxx.created) %]

感谢 MST 在 IRC 上帮助我。

【讨论】:

    【解决方案2】:

    您将 DBIx::Class 配置为将“created”列的值膨胀为DateTime 对象。

    请注意,您只需要加载基于 InflateColumn::DateTime 的 TimeStamp 组件,而不是两者都加载!

    此外,您应该将 on_connect_call => 'datetime_setup' 添加到您的 DBIx::Class connect_info 以使 DBIC 设置数据库日期时间格式以匹配它对 DateTime 对象膨胀的期望。这对每个受支持的数据库都是正确的,因此如果您切换数据库或使用 SQLite 进行测试,它也可以工作。

    Template::Plugin::Date 不是用于处理 DateTime 对象,Template::Plugin::DateTime 是。

    关于模板渲染,我建议您通过向 Catalyst::View::TT 视图添加一个方法来使用Catalyst::View::TT#expose_methods 功能,该方法将传递一个 DateTime 对象并返回一个格式化的字符串。您可以为不同的格式添加多种方法,例如日期+时间、仅日期等。 这样您就有了一个中心位置,它定义了可以在需要时轻松更改的 DateTime 格式。

    【讨论】:

    • 非常感谢!这正是我一直在寻找的。一个关于“请注意,您只需要加载基于 InflateColumn::DateTime 的 TimeStamp 组件”的问题 - 为什么这是正确的做事方式?我按照 Catalyst 教程进行操作,两个组件都已加载。
    • 那么 Catalyst 教程有问题。 TimeStamp 加载 InflateColumn::DateTime: metacpan.org/source/RIBASUSHI/DBIx-Class-TimeStamp-0.14/lib/…
    【解决方案3】:

    这个应该可以的:

    [% date.format(xxx.created.strftime('%Y-%m-%d %H:%M:%S')) %]
    

    【讨论】:

      【解决方案4】:
      date.format(xxx.created.replace('T', ' '));
      

      【讨论】:

      • 您能详细说明一下吗?当我输入此代码时,我会在每一列中获取当前时间,而不是存储在我的数据库中的时间。
      • $ cat t.tt2 [% USE date; t = '2012-08-30T21:28:22'; date.format(t.replace('T', ' ')); %] $ tpage t.tt2 21:28:22 30-Aug-2012
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2012-02-17
      • 2019-02-17
      相关资源
      最近更新 更多