You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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小时制格式:
    1. 存储代码(直接存带时区的Carbon实例):
    $UserRequest->finished_at = Carbon::now()->timezone('GMT+2');
    $UserRequest->save();
    
    1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:55:12