ctimestampbehavior通过配置createattribute、updateattribute、setstamponcreate、setstamponupdate和timestampexpression等属性控制时间戳写入逻辑,支持字段名、触发时机及自定义时间表达式(含php匿名函数),但不支持format/timezone等高级参数。

Yii 1.1.28 中的 CTimestampBehavior 是一个 ActiveRecord 行为(behavior),用于自动为模型的指定属性(如 create_time、update_time)赋值时间戳。它本身不支持直接传入“参数”进行动态调整,但可以通过配置其属性来控制行为逻辑,比如时间戳字段名、时间格式、是否使用 UNIX 时间戳或 DATETIME 字符串、是否仅在插入/更新时触发等。
以下是实际可调整的关键配置项与操作方式:
-
createAttribute和updateAttribute
指定哪个字段存创建时间、哪个存更新时间:public function behaviors() { return array( 'timestamp' => array( 'class' => 'zii.behaviors.CTimestampBehavior', 'createAttribute' => 'created_at', // 对应数据库字段 'updateAttribute' => 'updated_at', ), ); } -
setStampOnCreate/setStampOnUpdate
控制是否启用对应时间戳写入(默认都为true):'setStampOnCreate' => true, 'setStampOnUpdate' => false, // 禁用更新时覆盖,适合只记录首次创建时间
-
timestampExpression
自定义时间戳生成表达式,这是最关键的“参数调整点”:- 默认值为
new CDbExpression('NOW()')(MySQL)或time()(PHP 时间戳); - 可改为 UNIX 时间戳整数:
'timestampExpression' => new CDbExpression('UNIX_TIMESTAMP()'), - 或固定格式字符串(需数据库支持):
'timestampExpression' => new CDbExpression("DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')"), - 也可用 PHP 函数(注意:该表达式在 PHP 层执行,非 SQL):
'timestampExpression' => date('Y-m-d H:i:s'), // ⚠️ 静态值!仅首次加载时计算,不推荐✅ 正确做法是传匿名函数(Yii 1.1.28 支持):
'timestampExpression' => function() { return date('Y-m-d H:i:s'); },
- 默认值为
-
时区注意事项
NOW()依赖数据库服务器时区;若应用部署在 UTC 服务器但业务需东八区时间,建议:- 数据库层面设
SET time_zone = '+08:00'; - 或统一用 PHP 生成带时区的时间:
'timestampExpression' => function() { date_default_timezone_set('Asia/Shanghai'); return date('Y-m-d H:i:s'); },
- 数据库层面设
不支持的“伪参数”
CTimestampBehavior没有format、timezone、locale等高级参数——它只负责写入原始时间值,格式化展示应交给CFormatter或视图层处理,而非此行为。
调整后记得清空 Yii 缓存(如 runtime/cache 目录),确保 behavior 配置重载生效。











