yii中时间戳字段配置核心是timestampbehavior:数据库用datetime类型,模型中用expression('now()')由数据库生成时间,php与mysql时区需统一为asia/shanghai,gridview中用['datetime', 'php:y-m-d h:i']安全格式化。

Yii框架中时间戳字段(如 created_at、updated_at)的配置核心是用好 TimestampBehavior,配合数据库字段类型与模型定义,实现自动写入、安全更新、统一时区。不需要手动在每个 save() 前赋值,也不推荐在控制器里硬编码时间。
数据库字段类型要匹配
确保表中对应字段使用标准时间类型:
-
MySQL 推荐用
DATETIME(非TIMESTAMP),避免 MySQL 自动时区转换带来的歧义; - 字段允许为
NULL或设默认值(如CURRENT_TIMESTAMP),但 Yii 行为会覆盖默认值,所以更建议留空让行为控制; - 如果字段名不是
created_at/updated_at,比如叫add_time或last_modify,需在行为中显式指定。
模型中正确启用 TimestampBehavior
在模型类的 behaviors() 方法里配置,推荐使用 NOW() 数据库函数(比 PHP time() 更准,且自动适配时区):
public function behaviors()
{
return [
[
'class' => \yii\behaviors\TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'attributes' => [
\yii\db\ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
\yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
'value' => new \yii\db\Expression('NOW()'),
],
];
}
注意:value 用 Expression('NOW()') 是关键,它让时间由数据库生成,避免 PHP 与 MySQL 时区不一致问题。
时区必须全局对齐
时间显示不准、前后端差8小时,大概率是时区没统一:
- PHP 层:在入口文件或配置中设置
date_default_timezone_set('Asia/Shanghai');; - MySQL 层:确认服务器时区(
SELECT @@global.time_zone;),建议设为+08:00或SYSTEM并保持与 PHP 一致; - Yii 配置中可额外声明:
'formatter' => ['defaultTimeZone' => 'Asia/Shanghai'],影响视图格式化但不影响行为写入逻辑。
GridView 中安全显示时间
数据库存的是 '2026-08-17 14:20:00',前端直接用以下方式格式化,无需手动转时间戳:
[ 'attribute' => 'created_at', 'format' => ['datetime', 'php:Y-m-d H:i'] ]
这个写法会自动识别字符串日期、Unix 时间戳或 DateTime 对象,并按 PHP 格式规则输出;若字段可能为 null,它默认渲染为空白,不会报错或显示当前时间。











