Yii框架中TimestampBehavior可自动管理创建和更新时间戳,通过配置createdAtAttribute、updatedAtAttribute及UNIX_TIMESTAMP()表达式实现数据库级时间戳生成,无需手动赋值。

Yii 框架中使用 TimestampBehavior 自动管理创建时间和更新时间,是最常用、最简洁的时间戳处理方式。下面提供一个在 Yii 2.0+(如 2.0.48)中完整、可直接运行的实例,涵盖模型定义、行为配置、数据库字段要求及验证说明。
1. 数据库表结构(MySQL 示例)
确保数据表包含两个整型字段(INT(11) 或 BIGINT),用于存储 Unix 时间戳:
CREATE TABLE `post` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` text, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 模型类(Post.php)完整代码
在 models/Post.php 中定义模型,并启用 TimestampBehavior:
<?php namespace app\models;
<p>use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;<p>class Post extends ActiveRecord
{
/**</p>
- @inheritdoc */ public function behaviors() { return [ [ 'class' => TimestampBehavior::class, 'createdAtAttribute' => 'created_at', 'updatedAtAttribute' => 'updated_at', 'value' => new Expression('UNIX_TIMESTAMP()'), ], ]; }
/**
* @inheritdoc
*/
public function rules()
{
return [
[['title'], 'required'],
[['content'], 'string'],
[['created_at', 'updated_at'], 'integer'],
];
}
}
说明:
-
createdAtAttribute和updatedAtAttribute明确指定字段名,与数据库列一致; -
value使用Expression('UNIX_TIMESTAMP()')让 MySQL 在插入/更新时生成时间戳(推荐,精度高、不依赖 PHP 时区); - 若用 PHP 生成(如
time()),需确保服务器时区与业务一致,且注意并发下微秒级误差; - 字段允许为
NULL,行为会在beforeInsert和beforeUpdate自动赋值,无需手动设置。
3. 使用示例(控制器或控制台)
创建和更新记录时完全无感知:
// 创建新文章(自动写入 created_at & updated_at) $post = new Post(); $post->title = 'Hello Yii'; $post->content = 'This is my first post.'; $post->save(); // ✅ created_at 和 updated_at 已自动填充 <p>// 更新文章(仅 updated_at 变更) $post->title = 'Hello Yii (Updated)'; $post->save(); // ✅ updated_at 自动刷新,created_at 不变 </p>
4. 补充建议
时区统一: 若项目涉及跨时区展示,建议在应用层统一转为用户本地时间(如用 date() + Yii::$app->formatter->asDatetime()),数据库始终存 UTC 时间戳(MySQL 的 UNIX_TIMESTAMP() 默认基于系统时区,建议将 MySQL 时区设为 +00:00)。
兼容性注意: Yii 3.x 使用 yii\behaviors\TimestampBehavior,但配置键名略有不同(如 createdAtAttribute → createdAt),本文代码适用于 Yii 2.x 主流版本。
扩展场景: 如需记录操作人(created_by/updated_by),可叠加 BlameableBehavior,与 TimestampBehavior 共存无冲突。











