首页 > 解决方案 > 在 laravel 中使用日期格式的正确方法

问题描述

我有一个带有 Postgres 数据库的 Laravel 项目。我对日期格式有一些问题。

这是 Laravel Blade 中的一段输入字段

<div class="form-group col-md-3">
     <label for="nome" class="required">
       Birth Date
     </label>
     <input class="form-control date" type="text"value="{{ (!empty($patient) && $patient->datebirth) ? 
     Carbon\Carbon::parse($patient->datebirth)->format('d/m/Y') : '' }}"  name="datebirth" 
     id="datebirth" />
</div>

这是激活引导日期字段的脚本

$(document).ready(function() {
    $('.date').datepicker({
        firstDayOfWeek: 1, // The first day of week is Monday
        weekDayFormat: 'narrow', // Only first letter for the weekday names
        inputFormat: 'd/M/y',
        outputFormat: 'd/M/y',
        titleFormat: 'EEEE d MMMM y',
        markup: 'bootstrap4',
        theme: 'bootstrap',
        modal: false
    });
});

这是控制器代码

public function save(Request $req){
    $validatedData  = $req->validate([
        'name' => ['required', 'max:255'],
        'datebirth' => ['required','date'],
    ]);

   $newPatient = new Patient;
   $newPatient->name = $req->name;
   $newPatient->datebirth = $req->datebirth;
   $newPatient->save();
}

但是当我保存对象时,错误是:

SQLSTATE[22008]: Datetime field overflow: 7 ERROR: date/time field value out of range: "22/04/1985"...

因为数据库需要 ymd 格式,但我想在我的视图中使用 d/M/y。我更改了 outputFormat:在“y/M/d”中保存操作有效,但是当用户使用小部件(输入字段)更改日期时,它以 y/M/d 格式显示。

在控制器中,我只需获取请求的 datebirth 字段的值,将其分配给对象并保存。我想避免每次保存/编辑对象时在控制器中进行格式转换

处理这种情况的正确方法是什么?

有什么办法可以避免每次保存前都转换数据格式?

标签: phplaraveldatephp-carbon

解决方案


日期输入期望属性包含valueISO 8601YYYY-mm-dd格式的数据。由于您正在请求日期,因此使用此输入类型是填写表单的正确方法。当作为字符串回显时,Carbon 默认会转换为 ISO 8601。

<div class="form-group col-md-3">
    <label for="nome" class="required">
        Birth Date
    </label>
    <input
        type="date"
        class="form-control"
        value="{{ ($patient->datebirth ?? false) ? $patient->datebirth->toDateString() : '' }}"
        name="datebirth" 
        id="datebirth"
    />
</div>

发出请求时,输入将以 ISO 8601 格式发送到服务器。但是如果你正确设置了模型,Laravel 会在保存过程中自动处理格式。例如

class Patient extends Model
{
    protected $dates = [
        "datebirth",
    ];
}

推荐阅读