TimestampBehavior 是 Yii2 中用于自动管理创建和更新时间戳的行为,支持 Unix 时间戳或 datetime 字符串格式,通过 createdAtAttribute 和 updatedAtAttribute 控制字段,value 参数可设为 null、匿名函数、'datetime' 或 'timestamp',默认在 beforeInsert 和 beforeUpdate 时触发。

TimestampBehavior 是 Yii2 中最常用的自动时间戳行为之一,用于在模型保存时自动为指定属性赋值当前时间戳(Unix 时间戳)或日期时间字符串(datetime 格式)。它不依赖数据库字段类型,完全由 PHP 控制,灵活性高。
核心参数说明
createdAtAttribute:指定用于存储「创建时间」的属性名。默认为 'created_at'。设为 false 则禁用该功能。
updatedAtAttribute:指定用于存储「更新时间」的属性名。默认为 'updated_at'。设为 false 则禁用该功能。
value:定义时间值的生成方式,可为以下三种形式:
- null(默认):使用 time() 返回整型 Unix 时间戳;
- 匿名函数:如 function () { return date('Y-m-d H:i:s'); },返回格式化后的字符串;
- 字符串 'datetime':等价于调用 date('Y-m-d H:i:s');
- 字符串 'timestamp':等价于调用 time()(与默认行为一致)。
触发时机控制
该行为默认在 beforeInsert 和 beforeUpdate 事件中触发:
- 插入前:仅设置 createdAtAttribute(若启用),同时也会设置 updatedAtAttribute(若启用);
- 更新前:仅设置 updatedAtAttribute(若启用);
可通过重写 evaluateAttributes() 或监听特定事件自定义逻辑,但通常无需改动。
常见配置示例
在模型 behaviors() 方法中使用:
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => function () {
return date('Y-m-d H:i:s');
},
],
];
}
若数据库字段是 INT 类型存 Unix 时间戳,可简化为:
'timestamp' => [
'class' => TimestampBehavior::className(),
'value' => 'timestamp', // 或直接留空(默认)
],
若只需更新时间、无需创建时间:
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => false,
'updatedAtAttribute' => 'updated_at',
],
注意事项
该行为不会覆盖已显式赋值的属性值(即模型属性已有非-null 值时跳过);
若使用 datetime 字符串,请确保数据库字段支持该格式(如 MySQL 的 DATETIME 或 TIMESTAMP);
在批量插入(insertAll)或原生 SQL 操作中不生效,仅对 save()、insert()、update() 等 ActiveRecord 方法有效;
如需兼容 MySQL 的 NOW() 或 PostgreSQL 的 CURRENT_TIMESTAMP,建议改用数据库默认值 + 迁移定义,而非此行为。











