thinkphp模型自动时间戳生效需严格匹配写入格式与数据库字段类型:'datetime'配datetime/timestamp、'timestamp'配int、'date'配date;自定义字段名须在模型中同步配置$createtime等属性;读取格式化需通过datetime_format或获取器实现。

ThinkPHP模型自动时间戳格式不能靠“改显示样式”来实现,关键在于写入时的类型选择与数据库字段类型的严格匹配。设对了 $autoWriteTimestamp 的值,再配好字段类型,格式才真正生效。
一、明确写入格式由 $autoWriteTimestamp 决定
这个属性不是开关,而是格式指令:
-
'datetime':写入Y-m-d H:i:s字符串,数据库字段必须是DATETIME或TIMESTAMP -
'timestamp'(或'int'):写入 10 位整型时间戳,字段建议用INT或BIGINT -
'date'(TP6.3+ 支持):只写日期部分Y-m-d,字段需为DATE类型 -
true:不指定格式,按全局配置config/database.php中的auto_timestamp值执行
二、确保数据库字段类型完全匹配
错配会导致静默失败——比如写入成功但查出来是 0000-00-00 00:00:00 或 0:
- 用
'datetime'→ 字段必须是DATETIME或TIMESTAMP - 用
'timestamp'→ 字段推荐INT(11),避免 MySQLTIMESTAMP自动时区转换干扰 - 用
'date'→ 字段必须是DATE,否则时分秒会被截断或报错
三、自定义字段名要同步改模型配置
字段叫 created_at 或 add_time?不能只改数据库,模型里也得对上:
- TP6:在模型中加 protected $createTime = 'created_at'; 和 protected $updateTime = 'updated_at';
- TP5:同样设置这两个属性,且保持大小写、下划线完全一致(Linux 环境区分大小写)
- 若只需创建时间,把
$updateTime设为false即可禁用更新时间写入
四、读取时格式化要另做处理
datetime_format 配置只影响查询后的自动转换,不影响写入。它在 config/database.php 里设置,例如:
-
'datetime_format' => 'Y/m/d':查出的DATETIME字段会转成该字符串格式 -
'datetime_format' => false:不转换,返回原始字符串或整数,适合前端自己处理 - 想让 API 同时返回原始时间戳和格式化日期?用获取器:
getCreateTimeAttr()返回date('Y-m-d', $value),再配合append添加虚拟字段
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











