You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:21:18