Yii框架时间戳未写入主因是TimestampBehavior的value返回值与数据库字段类型不匹配:INT字段用time(),DATETIME用date()字符串,TIMESTAMP用NOW()表达式;需确认behaviors配置、字段名一致、事件映射正确,并排除loadDefaultValues干扰及显示问题。

Yii框架保存数据时没有自动写入时间戳,通常不是框架“失效”,而是配置没对上数据库字段类型或行为逻辑。核心在于:TimestampBehavior 本身不关心字段类型,但你给它的 value 必须匹配数据库能接受的值。
检查数据库字段类型是否匹配 value 返回值
这是最常见原因。TimestampBehavior 默认返回 time()(整型时间戳),只适合 INT/BIGINT 类型字段;如果字段是 DATETIME 或 TIMESTAMP 类型,就必须改 value 返回字符串或数据库表达式:
- DATETIME 字段 →
'value' => function () { return date('Y-m-d H:i:s'); } - TIMESTAMP 字段(MySQL)→ 更推荐
'value' => new \yii\db\Expression('NOW()'),由数据库生成,避免 PHP 和 MySQL 时区不一致 - INT 字段 → 保持默认
'value' => time()即可
确认 behaviors() 配置已启用且属性名正确
行为必须在模型的 behaviors() 方法中正确定义,并且 createdAtAttribute / updatedAtAttribute 指向的字段名,要和数据库实际字段名完全一致(区分大小写):
- 比如数据库字段叫
created_time,就不能写成'createdAtAttribute' => 'created_at' - 确保
attributes映射了对应事件:EVENT_BEFORE_INSERT和EVENT_BEFORE_UPDATE
排查是否被 loadDefaultValues 干扰
如果模型启用了 ActiveRecord::loadDefaultValues = true,而数据库字段又设了默认值(如 CURRENT_TIMESTAMP),两者可能冲突,导致行为设置的时间被覆盖。建议:
- 关掉
loadDefaultValues,统一由 TimestampBehavior 控制 - 或删掉数据库字段的默认值,把时间控制权完全交给 PHP 层
验证是否真没写入,还是查询/显示问题
有时时间字段“看起来为空”,其实是查出来后没格式化、或视图里直接 echo null 值导致显示空白。可临时加日志验证:
- 在
beforeSave()里打印$this->created_at看是否已赋值 - 查数据库确认字段值是否真的为 NULL 或 0000-00-00 00:00:00
- 避免用
asArray()后直接输出,忽略 getter 或格式化逻辑


















