我正在使用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) %]
那么我该如何才能让它发挥作用呢?提前谢谢。
答案 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', ' '));