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

Laravel中如何转换时间格式?无需访问器实现08:00:00转08:00

问题解答

很遗憾的告诉你,你尝试的这种'time:H:i'格式配置$casts的方式是行不通的。

Laravel的$casts属性里,time类型的作用是把数据库的time字段转换成Carbon实例(或者DateTimeInterface的实现类),它并不支持在time后面直接追加格式化字符串——time类型的cast只接受单纯的'time'作为配置值,带额外参数的写法会被框架识别错误,甚至可能抛出异常。

那不想用访问器的话,有哪些替代方案呢?给你几个思路:

  • 手动格式化属性:因为opens和closes会被自动转为Carbon实例,你可以在获取的时候直接调用format方法,比如$yourModel->opens->format('H:i'),这样就能得到08:00这样的字符串。
  • 查询时直接格式化:如果是从数据库查询的时候就想拿到格式化后的结果,可以用数据库的原生函数处理,比如MySQL的TIME_FORMAT:
    $models = YourModel::selectRaw('*, TIME_FORMAT(opens, "%H:%i") as opens_formatted, TIME_FORMAT(closes, "%H:%i") as closes_formatted')->get();
    
    这样查询结果里的opens_formatted和closes_formatted就是你想要的格式了。
  • 全局序列化格式化(谨慎使用):如果你是需要在序列化模型(比如返回API响应)时统一格式化时间,可以重写模型的serializeDate方法:
    protected function serializeDate(\DateTimeInterface $date)
    {
        return $date->format('H:i');
    }
    
    注意这个方法会影响模型里所有日期时间类型的字段序列化,如果只有opens和closes需要特殊处理,这个方法可能不太合适,还是手动格式化更精准。

总结一下:$casts里的time类型不支持自定义格式,你得通过上面这些方式来实现需求。

内容的提问来源于stack exchange,提问作者Philipp Mochine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:11