格式化TemplateToolkit中输出的时间戳字段

时间:2013-01-24 18:54:16

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

我正在使用Perl和Catalyst框架,DBIx类作为ORM,TT作为视图,Postgresql作为DB。

我有一个带有'timestamp without timezone'类型的列,如果我在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 个答案:

答案 0 :(得分:5)

您配置了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#expose_methods功能,在Catalyst :: View :: TT视图中添加一个方法,该方法传递一个DateTime对象并返回一个格式化的字符串。您可以为不同的格式添加多种方法,例如日期+时间,仅限日期等。 这样,您就拥有了一个定义DateTime格式的中心位置,如果需要,可以轻松更改。

答案 1 :(得分:2)

这个应该有效:

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

答案 2 :(得分: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');结束%]

[%disp_dt(xxx.created)%]

感谢MST在IRC帮助我。

答案 3 :(得分:-1)

date.format(xxx.created.replace('T', ' '));