如何在Blade视图中将时间列属性转换为带AM/PM的12小时制格式
解决方案
方法1:直接在Blade视图中格式化(临时使用场景)
如果只需要在当前页面修改格式,不需要复用,直接调用Carbon的format方法即可,Laravel默认会将模型中声明的日期字段转为Carbon实例:
{{ $timeEntry->time_start->format('h:i:A') }}
如果你的模型没有将time_start识别为日期字段,先手动解析时间再格式化:
{{ \Carbon\Carbon::parse($timeEntry->time_start)->format('h:i:A') }}
格式说明:
h代表12小时制带前导零的小时,i代表带前导零的分钟,A代表大写的AM/PM标识,完全匹配你需要的09:51:AM格式。
方法2:模型定义访问器(多场景复用)
如果需要在多个页面使用该格式,在TimeEntry模型中定义访问器,避免重复写格式化代码:
- 打开
app/Models/TimeEntry.php文件,添加对应方法:
// Laravel 9+ 新版本访问器写法 use Illuminate\Database\Eloquent\Casts\Attribute; protected function timeStart(): Attribute { return Attribute::make( get: fn ($value) => \Carbon\Carbon::parse($value)->format('h:i:A'), ); } // 旧版本Laravel兼容写法 public function getFormattedTimeStartAttribute() { return $this->time_start->format('h:i:A'); }
- Blade中直接调用即可:
{{-- 对应新版本访问器 --}} {{ $timeEntry->time_start }} {{-- 对应旧版本访问器 --}} {{ $timeEntry->formatted_time_start }}
方法3:模型全局声明日期格式(全场景统一输出)
如果所有用到time_start的场景都需要使用该格式,直接在模型的$casts属性中声明输出格式:
protected $casts = [ 'time_start' => 'datetime:h:i:A', // 其他字段的类型转换规则 ];
之后所有地方直接输出{{ $timeEntry->time_start }}都会自动转为你需要的格式。
常见问题排查
如果运行时报错Call to a member function format() on string,说明模型没有将time_start识别为日期字段,需要在模型中添加如下配置:
// Laravel 旧版本写法 protected $dates = [ 'time_start', ]; // Laravel 8+ 推荐写法,添加到$casts数组中 protected $casts = [ 'time_start' => 'datetime', ];
内容的提问来源于stack exchange,提问作者kealaxshan
相关产品推荐
相关产品推荐

