yii中timestampbehavior默认用time()写入整型时间戳,若字段为datetime/timestamp需自定义value闭包返回'y-m-d h:i:s'等字符串格式,并注意时区处理与字段类型匹配。

Yii框架中,TimestampBehavior 默认使用 time()(即 Unix 时间戳整数)写入数据库字段,但如果你的数据库字段是 DATETIME 或 TIMESTAMP 类型(如 MySQL),而你希望存入格式化的时间字符串(如 'Y-m-d H:i:s'),就需要自定义时间生成逻辑。
指定 value 为匿名函数实现自定义时间格式
在模型的 behaviors() 方法中,为 createdAtAttribute 或 updatedAtAttribute 对应的 value 配置一个返回字符串的闭包即可:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => function () {
return date('Y-m-d H:i:s'); // 写入 '2024-05-20 14:30:45'
},
],
];
}
区分创建与更新时间的独立格式
若需对创建时间和更新时间使用不同格式(比如创建用完整时间、更新只记日期),可分别配置 createdAtAttribute 和 updatedAtAttribute 的 value:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => function () {
return date('Y-m-d H:i:s');
},
'attributes' => [
BaseActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
BaseActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
],
];
}
注意:此时需显式通过 attributes 映射事件和字段,否则闭包会同时作用于两个字段。
配合时区或 DateTime 对象更灵活控制
如果项目需统一处理时区,推荐使用 DateTime 对象增强可读性与扩展性:
- 使用
new DateTime('now', new DateTimeZone('Asia/Shanghai'))确保时区一致 - 在闭包中调用
format()输出所需格式:return (new DateTime('now', new DateTimeZone('Asia/Shanghai')))->format('Y-m-d H:i:s'); - 避免直接依赖服务器默认时区,防止部署环境差异导致时间错乱
数据库字段类型需匹配写入值类型
务必确认数据库字段类型支持字符串写入:
-
DATETIME(MySQL)可直接接收'Y-m-d H:i:s'字符串 -
TIMESTAMP同样兼容该格式,但会自动转为 UTC 存储(取决于 MySQL 配置) - 若字段是整数类型(如
INT(11)),则必须保持value返回time()或strtotime()结果
不匹配会导致插入失败或截断(如把 '2024-05-20 14:30:45' 写进 INT 字段,可能变成 2024)。











