Laravel中如何在表单与视图中获取格式化后的时间字段?
解决Laravel中时间字段的格式化显示问题
看起来你已经搞定了日期字段date_seance的格式化,但start_time和end_time还没达到预期效果对吧?别担心,这里有几种简单的方案帮你实现把时间显示成20:00这样的格式:
方案1:让模型把时间字段转为Carbon实例(最基础的方法)
你的Course模型里注释掉了$dates属性,把它打开就可以让Laravel自动把start_time和end_time转换成Carbon实例,这样就能像date_seance一样调用format()方法了:
class Course extends Model { protected $dates = ['date_seance', 'start_time', 'end_time']; }
然后在你的index.blade.php视图里,直接对时间字段调用format('H:i')即可:
@foreach($course as $item) <tr> <td> {{$item->date_seance->format('d/m/Y') }}</td> <td> {{$item->start_time->format('H:i') }}</td> <td> {{$item->end_time->format('H:i') }}</td> @endforeach
方案2:使用模型访问器(更优雅,复用性强)
如果不想每次在视图里都写format('H:i'),可以给模型添加访问器,自动处理格式化逻辑:
在Course模型里添加两个访问器方法:
class Course extends Model { protected $dates = ['date_seance', 'start_time', 'end_time']; // 格式化开始时间 public function getFormattedStartTimeAttribute() { return $this->start_time->format('H:i'); } // 格式化结束时间 public function getFormattedEndTimeAttribute() { return $this->end_time->format('H:i'); } }
之后在视图里直接调用自定义的属性名即可,代码更简洁:
@foreach($course as $item) <tr> <td> {{$item->date_seance->format('d/m/Y') }}</td> <td> {{$item->formatted_start_time }}</td> <td> {{$item->formatted_end_time }}</td> @endforeach
方案3:使用字段类型转换(Laravel 5.6+推荐)
如果你希望从模型获取时间字段时直接得到格式化后的字符串,可以用$casts属性指定格式,这样就不需要手动调用format()了:
class Course extends Model { protected $casts = [ 'date_seance' => 'date:d/m/Y', // 日期直接格式化 'start_time' => 'datetime:H:i', 'end_time' => 'datetime:H:i', ]; }
这时候视图里直接输出字段即可:
@foreach($course as $item) <tr> <td> {{$item->date_seance }}</td> <td> {{$item->start_time }}</td> <td> {{$item->end_time }}</td> @endforeach
⚠️ 注意:用$casts指定格式后,字段返回的是字符串而不是Carbon实例,如果之后还需要对时间做其他Carbon操作(比如计算时间差),建议还是用方案1或方案2。
表单中显示格式化时间
如果是在编辑表单里要显示格式化后的时间(比如用type="time"的输入框),可以这样写:
<div class="form-group"> <label>开始时间</label> <input type="time" name="start_time" class="form-control" value="{{ old('start_time', $course->start_time->format('H:i')) }}"> </div>
这样既会回显旧的输入值(验证失败时),也会默认显示格式化后的时间。
内容的提问来源于stack exchange,提问作者user11124425
相关产品推荐
相关产品推荐

