Mojolicious数组日期转换报错:找不到strftime方法
解决Perl Mojolicious中日期字符串无法调用strftime的问题
哈哈,这个坑我踩过!你遇到的报错本质是——从数据库查出来的日期是普通字符串(比如Feb 5 2018 08:15AM),不是Time::Piece模块生成的对象,自然没法直接调用strftime方法呀~
核心问题拆解
你之前用localtime得到的是Time::Piece的实例,所以能直接调用它的方法;但数据库返回的是纯文本格式的日期,Perl只会把它当成普通字符串处理,没有strftime这个方法,所以才会报错“can't locate object method strftime via package..."。
两种解决方案
推荐优先在控制器里处理日期转换(视图尽量只做展示逻辑),当然也可以在视图里临时处理,两种方式都给你列出来:
方案1:控制器中转换为Time::Piece对象
在把数据传给视图前,遍历查询结果,用Time::Piece的strptime方法把字符串解析成对象:
# 假设你已经执行完查询,结果存在@query数组中 foreach my $row (@query) { # 取出数据库返回的日期字符串(对应你的date1字段,即数组第0位) my $date_str = $row->[0]; # 关键:用strptime解析,格式要和数据库返回的字符串完全匹配! # 这里的"%b %e %Y %I:%M%p"对应"Feb 5 2018 08:15AM"的格式 my $tp_date = Time::Piece->strptime($date_str, "%b %e %Y %I:%M%p"); # 把原数组中的字符串替换成Time::Piece对象 $row->[0] = $tp_date; } # 再传递给视图 $c->stash(query_data => \@query);
之后在视图里就可以直接调用strftime了:
% foreach my $data (@$query_data) { <p>原始日期:<%= $data->[0] %></p> <p>格式化后:<%= $data->[0]->strftime('%Y%m%d') %></p> % }
方案2:视图中临时转换(不推荐)
如果一定要在视图里处理,记得先加载Time::Piece,再解析字符串:
% use Time::Piece; % foreach my $data (@$query_data) { % my $date_str = $data->[0]; % # 同样要保证格式字符串和返回的日期匹配 % my $tp_date = Time::Piece->strptime($date_str, "%b %e %Y %I:%M%p"); <p>转换后日期:<%= $tp_date->strftime('%Y%m%d') %></p> % }
注意事项
- 格式字符串必须精准匹配:如果数据库返回的日期格式有细微差别(比如日期是两位带0的
05,或者AM/PM是小写),要调整strptime的格式符,比如%d对应两位日期,%P对应小写的am/pm。不确定的话,可以用Data::Dumper打印一下日期字符串,确认具体格式。 - 备选思路:如果数据库支持,也可以直接在SQL查询中格式化日期(比如MySQL用
DATE_FORMAT(date1, '%Y%m%d')),这样拿到的就是直接符合要求的字符串,不用在Perl中处理,但灵活性不如Time::Piece高。
内容的提问来源于stack exchange,提问作者user3525290
相关产品推荐
相关产品推荐

