2

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

我有一个“没有时区的时间戳”类型的列,如果我在 Postgres 中进行手动查询,列值就是这种格式2012-08-30 21:30:14,但是当我在 TT 视图文件中打印值时,我得到了这样的结果2012-08-30T15:03:13,所以很明显它被格式化了,但是究竟是什么我不能说。

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

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

带有 xxx/list.tt2 中的代码[% date.format(xxx.created) %]

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

4

4 回答 4

5

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

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

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

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

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

于 2013-01-24T22:18:32.380 回答
2

这个应该工作:

[% date.format(xxx.created.strftime('%Y-%m-%d %H:%M:%S')) %]
于 2013-01-24T21:33:23.110 回答
2

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

要修复您的代码示例:

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

对于其他格式,请阅读 strftime 联机帮助页。

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

[% MACRO disp_dt(dt) BLOCK; dt.strftime( '%Y: %B %d' ) ; END %]

[% disp_dt( xxx.created ) %]

Thanks to MST for helping me with this on IRC.

于 2013-09-02T22:45:53.840 回答
-1
date.format(xxx.created.replace('T', ' '));
于 2013-01-24T19:45:44.237 回答