Laravel中Carbon写入SQL仅存储指定时间格式问题求助
解决Laravel中Carbon时间存入数据库仅保留时分的问题
问题根源
核心问题是数据库字段类型不匹配:如果finished_at字段是datetime或timestamp类型,MySQL会自动为传入的纯时间字符串补充默认日期(比如当前日期或0000-00-00),导致存储结果是完整的日期时间格式。
解决方案分三种场景,按需选择:
1. 修改数据库字段为time类型(存24小时制时间)
- 登录phpMyAdmin,找到目标表的
finished_at字段,将类型从datetime/timestamp改为time(MySQL的time类型专门用于存储HH:MM:SS格式的时间)。 - 调整代码:
// 生成GMT+2时区的24小时制时间字符串 $UserRequest->finished_at = Carbon::now()->timezone('GMT+2')->toTimeString(); $UserRequest->save();
- 说明:这种方式存储的是24小时制时间(如
14:30:00),如果需要展示12小时制,可在读取时再格式化。
2. 修改字段为varchar类型(直接存12小时制带am/pm)
- 若必须存储
12:09 pm这种格式,将字段类型改为varchar(10)(长度按需调整)。 - 调整代码:
// 自定义格式生成12小时制时间字符串 $UserRequest->finished_at = Carbon::now()->timezone('GMT+2')->format('h:i a'); $UserRequest->save();
- 注意:用字符串存储时间会失去数据库对时间字段的查询能力(比如排序、时间范围筛选),非必要不推荐。
3. 保留datetime字段,读取时格式化输出(推荐)
- 保留原字段类型,存储完整的日期时间(方便后续时间相关操作),通过Laravel模型的访问器在读取时自动转为12小时制格式:
- 存储代码(直接存带时区的Carbon实例):
$UserRequest->finished_at = Carbon::now()->timezone('GMT+2'); $UserRequest->save();- 在
UserRequest模型中添加访问器:
/** * 格式化finished_at字段的输出 */ public function getFinishedAtAttribute($value) { return Carbon::parse($value)->timezone('GMT+2')->format('h:i a'); } - 使用时直接调用属性即可得到目标格式:
echo $userRequest->finished_at; // 输出如12:09 pm
内容的提问来源于stack exchange,提问作者Ruan
相关产品推荐
相关产品推荐

