thinkphp模型时间戳格式由$autowritetimestamp值类型与数据库字段类型严格匹配决定:设为'datetime'需datetime字段,'timestamp'需int字段;datetime_format仅影响读取转换,不控制写入。

ThinkPHP模型里自定义时间戳格式,关键不在字段名,而在 $autoWriteTimestamp 的值类型和数据库配置的 datetime_format 是否匹配——错配会导致写入成功但读出为空、或写入成 0000-00-00。
设置 $autoWriteTimestamp 为字符串类型(如 'datetime')才生效
很多人设了 protected $autoWriteTimestamp = true; 却发现时间戳仍是 int 类型,原因在于:true 只表示“启用”,但格式由全局配置 auto_timestamp 决定;而显式指定字符串才能覆盖全局行为。
-
protected $autoWriteTimestamp = true;→ 按config/database.php中'auto_timestamp' => 'datetime'或默认int执行 -
protected $autoWriteTimestamp = 'datetime';→ 强制用Y-m-d H:i:s格式写入(需数据库字段为DATETIME或TIMESTAMP) -
protected $autoWriteTimestamp = 'timestamp';→ 写入 Unix 时间戳整数(10 位),字段类型建议INT或BIGINT - TP6.3+ 支持
'date'(仅日期,Y-m-d),但注意 MySQLDATE字段不存时分秒
数据库字段类型必须和 $autoWriteTimestamp 值严格对应
常见错误:设了 'datetime',但数据库字段是 INT(11),结果写入失败或变成 0000-00-00 00:00:00;反过来,字段是 DATETIME 却用 true(默认 int),也会被截断或报错。
-
'datetime'→ 字段类型必须是DATETIME或TIMESTAMP(MySQL) -
'timestamp'→ 字段类型建议INT/BIGINT,避免 MySQLTIMESTAMP自动转换时区 -
'int'和'timestamp'在 TP 中等价,但语义上'timestamp'更明确 - TP 不校验字段类型,只管按格式拼 SQL —— 错配后错误常静默发生,查
$model->getLastSql()才能定位
datetime_format 配置影响的是“读出”,不是“写入”
很多开发者以为改了 datetime_format 就能控制写入格式,其实它只作用于模型查询后的自动类型转换。写入格式完全由 $autoWriteTimestamp 决定。
- 数据库配置中
'datetime_format' => 'Y/m/d'→ 查询时把DATETIME字段转成该字符串,但写入仍是Y-m-d H:i:s(除非你重写了获取器) - 设
'datetime_format' => false→ 查询时不转,返回原始字符串或时间戳,适合前端自己处理 - 若想读写都用
Y/m/d,得配合获取器(getCreateTimeAttr)和修改器(setCreateTimeAttr),不能只靠配置
自定义字段名时,$createTime/$updateTime 必须和数据库列名一字不差
比如数据库列叫 _created_at,模型里就得写 protected $createTime = '_created_at';。框架不做任何下划线/驼峰转换,大小写敏感,多一个空格都会写不进。
- TP5.1 和 TP6 都要求字段名完全一致,不支持自动映射
- 若字段带前缀(如
log_create_time),就老老实实写全名:protected $createTime = 'log_create_time'; - 字段被
allowField过滤掉时,时间戳也不会写入 —— 调试时先dump($model->getData())确认字段是否存在 - TP6 默认只在 insert 时写
$createTime,update 时不会覆盖它;若需更新,得手动赋值或用save(['_created_at' => ...], [...], ['force' => true])
最易忽略的一点:时间戳格式是“写入时决定、读出时转换”,两者解耦。你以为改了配置就能统一格式,实际可能写入是 datetime、读出被 datetime_format 强制转成 int,结果前端拿到数字却以为是字符串 —— 查数据表结构 + 看 getLastSql() + 打印 getData() 三步缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











