Yii框架推荐时间戳字段统一用DATETIME类型存储,需配置数据库字段、模型TimestampBehavior行为及视图Formatter格式化,并确保PHP、Yii、MySQL三端时区一致。

Yii框架中时间戳字段推荐统一用 DATETIME 类型存储,而不是 INT 时间戳,这样能避免时区转换混乱、搜索逻辑复杂、格式化易出错等问题。配置核心围绕三部分:数据库字段类型、模型行为绑定、视图层格式化。
数据库字段定义为 DATETIME
建表时直接使用 DATETIME(非 TIMESTAMP),例如:
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMPupdated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL 的 CURRENT_TIMESTAMP 默认按服务器时区生成,配合 PHP 层统一时区更可控。
模型中配置 TimestampBehavior
在 ActiveRecord 模型的 behaviors() 方法里启用自动填充:
- 指定
createdAtAttribute和updatedAtAttribute对应字段名(如'created_at') -
attributes明确事件触发时机:EVENT_BEFORE_INSERT填两个字段,EVENT_BEFORE_UPDATE只填updated_at -
value推荐用new \yii\db\Expression('NOW()'),确保由 MySQL 执行,精度高且时区一致
视图中用 Formatter 安全格式化
显示时别直接调用 date() 或 strtotime(),优先走 Yii 内置格式器:
- 在 GridView 或 DetailView 中写:
'format' => ['datetime', 'php:Y-m-d H:i:s'] - 单独输出可用:
Yii::$app->formatter->asDatetime($model->created_at) - 若字段可能为 null,Formatter 会自动转为空字符串,无需额外判空(相比
dateformatter->format()更安全)
时区必须全局对齐
三个地方要设成同一时区(比如 Asia/Shanghai):
- PHP 配置:
date_default_timezone_set('Asia/Shanghai')(入口文件或 config/web.php) - Yii 应用配置:
'timeZone' => 'Asia/Shanghai'(在config/web.php的components下) - MySQL 服务端:
SET time_zone = '+08:00';或修改 my.cnf
不对齐会导致“存的是现在,查出来差8小时”这类典型问题。


















