Yii2 GridView 日期格式化与搜索实现方法

Elena
Elena
发布时间:2026-10-14 | 4人浏览过
原创

在使用 Yii2 的 GridView 组件展示数据时,日期字段的显示格式往往需要定制。特别是当数据库中存储的是 Unix 时间戳而非标准 datetime 类型时,不仅前端展示需要转换,后端搜索功能也需特殊处理。本文将分别介绍基于 datetime 和时间戳两种场景下的格式化输出与搜索实现代码。

基础效果图示

首先展示处理后的效果。通常情况下,我们需要将原始数据转换为易读的日期格式,例如 "2016-01-01"。对于时间戳字段,直接输出会导致数字显示,因此需要转换。

GridView 中的日期格式化

根据数据库中 created_at 字段的不同存储类型,处理方式分为两种情况:

第1步:数据库字段为 datetime 类型

如果数据库中存储的是标准的 date 或 datetime 字符串,操作最为简单。直接在 GridView 配置中输出该属性即可,无需额外定义 value 回调函数。

完成状态:列表中直接显示标准的日期时间字符串。

第2步:数据库字段为时间戳(Timestamp)类型

若数据库存入的是整型时间戳,需在 GridView 的 columns 配置中通过回调函数或 format 属性进行转换。以下提供两种等效写法:

// 方式一:使用 callback 函数
[
    'attribute' => 'created_at',
    'value' => function ($model) {
        return date('Y-m-d H:i:s', $model->created_at);
    },
],
// 方式二:使用 format 数组(更简洁)
[
    'attribute' => 'created_at',
    'format' => ['date', 'Y-m-d H:i:s'],
],

上述两种方法均可实现时间戳到可读日期的转换,建议优先使用 format 方式以保持代码整洁。

实现日期搜索功能

格式化显示只是第一步,结合 SearchModel 实现筛选搜索才是关键。当用户在搜索框输入日期(如 "2016-01-01")时,数据库可能需要将其转换为时间戳范围进行查询。

第1步:Datetime 类型的搜索处理

如果数据库字段本身就是 datetime 类型,且搜索框输入格式与数据库格式一致(或直接使用 Yii2 内置的日期过滤器),通常可以直接匹配。在 SearchModel 的 rules 和 search 方法中保持默认行为即可,无需修改 query 逻辑。

第2步:时间戳类型的搜索处理

这是最常见的痛点。用户在前端搜索框输入的是 "2016-01-01",但数据库存的是时间戳整数。不能直接相等匹配,必须将输入日期转换为当天起始时间戳至次日起始时间戳的范围查询。

入口:SearchModel 类的 search() 方法

动作:判断输入值非空后,利用 strtotime() 计算时间边界,并构造 AND 条件。

// 在 SearchModel 的 search() 方法中加入以下逻辑
if ($this->created_at) {
    // 将输入的日期字符串转换为当天 00:00:00 的时间戳
    $createdAt = strtotime($this->created_at);
    // 加上 24小时秒数,获取第二天的时间戳作为上限
    $createdAtEnd = $createdAt + 24*3600;
    
    // 构建时间范围查询条件:大于等于当日,小于次日
    $query->andWhere("created_at >= {$createdAt} AND created_at < {$createdAtEnd}");
}

重要参数:$this->created_at 来自表单提交的搜索值。
完成状态:点击搜索按钮后,Grid 仅显示指定日期对应的记录。

总结与建议

在实际项目中,建议数据库层面尽量统一使用 DATETIME 类型存储日期时间,这样可以避免大量的时间戳转换运算,简化搜索逻辑。但如果受限于旧数据结构必须使用时间戳,则需严格遵循上述转换逻辑,确保前后端数据一致性。

以上就是Yii2 GridView日期格式化处理及时间戳搜索的详细内容,更多关于Yii2日期搜索的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表