Php 在laravel中使用日期格式的正确方法

Php 在laravel中使用日期格式的正确方法,php,laravel,date,php-carbon,Php,Laravel,Date,Php Carbon,我有一个带有Postgres数据库的Laravel项目。我对日期格式有一些问题 这是Laravel刀片中的一个输入字段 出生日期 这是激活引导日期字段的脚本 $(文档).ready(函数(){ $('.date').datepicker({ 星期一:1,//一周的第一天是星期一 weekDayFormat:'窄',//仅为工作日名称的第一个字母 输入格式:“d/M/y”, 输出格式:“d/M/y”, 标题格式:“EEEE d MMMM y”, 标记:“bootstrap4”, 主题:“引导”

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

这是Laravel刀片中的一个输入字段


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

$(文档).ready(函数(){
$('.date').datepicker({
星期一:1,//一周的第一天是星期一
weekDayFormat:'窄',//仅为工作日名称的第一个字母
输入格式:“d/M/y”,
输出格式:“d/M/y”,
标题格式:“EEEE d MMMM y”,
标记:“bootstrap4”,
主题:“引导”,
模态:假
});
});
这是控制器代码

公共功能保存(请求$req){
$validatedData=$req->validate([
'name'=>['required','max:255'],
“datebirth”=>[“必需”,“日期”],
]);
$newPatient=新患者;
$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"...
因为数据库需要y/m/d格式,但我希望在视图中使用d/m/y。I更改outputFormat:在“y/M/d”中,保存操作有效,但当用户使用小部件(输入字段)更改日期时,它将以y/M/d格式显示

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

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

有没有办法避免每次保存前都转换数据格式?

A使用
属性以包含ISO 8601
yyy-mm-dd
格式的数据。由于您请求的是日期,因此使用此输入类型是填写表单的正确方法。默认情况下,当作为字符串进行回声时,Carbon将转换为ISO 8601


出生日期
当发出请求时,输入将以ISO 8601格式发送到服务器。但是,如果您正确设置模型,Laravel将在保存期间自动处理格式设置。例如

class患者扩展模型
{
受保护的$日期=[
“出生日期”,
];
}

如果要将日期从DD/MM/YYYY格式转换为YYYY/MM/DD(后跟数据库日期数据类型和时间戳数据类型)

然后,您可以在将数组数据传递到数据库之前修改Laravel请求数组

$request->merge([
     'deal_date' => $deal_date,
]);
或者您想在请求中添加任何字段,然后您可以像这样

$request->request->add(['user_id' => $user_id]);
$request->request->remove('store_idname');
或者您想从请求中删除任何字段,那么您也可以这样做

$request->request->add(['user_id' => $user_id]);
$request->request->remove('store_idname');

我已使用变异子解决了该问题:

public function setBirthDateAttribute($value)
    {
        if( $value ){
            $data = Carbon::createFromFormat('d/m/Y', $value)->format('Y-m-d');
            $this->attributes['birthDate'] = $data;
        }
    }

在实际尝试将此值保存到数据库的位置共享代码。在保存之前,您可能只需要将输入内容
22/04/1985
格式化为有效日期
1985-04-22
或日期时间
1985-04-22 00:00:00
。旁注:如果允许用户在前端选择格式,则此语句不可避免:“我希望避免每次保存/编辑对象时在控制器中进行格式转换“.我得选一个.我已经更新了帖子。不,用户不能选择格式,他只能更改datebirth字段的值。示例:更改为1985年4月22日至1985年4月25日。用户界面的格式总是d/M/y。哦,对不起,一定是误读了。但仍然需要进行一些格式交换,在前端进行
d/m/Y
,然后在后端进行
Y-m-d
。看起来你现在正在这样做,所以我不知道为什么它会以错误的格式显示在前端。谢谢你的回答,但是这样做,当我打开页面时,当用户更改日期(例如更改日期)时,输入字段的日期格式为“1985-04-22 00:00:00”显示的是1985/04/21。您应该去掉Javascript日期选择器,使用浏览器的。如果列是DATETIME而不是DATE,则其字符串表示形式将包括时间,但浏览器不应为日期类型输入显示时间。无论如何,我会更新答案。为了清楚起见,这将使用客户端的浏览器区域设置来确定日期输入的显示格式。强制用户遵守您的日期格式只是不必要的摩擦。使用Javascript date widget,用户有一个功能更强大、更愉快的组件,最重要的是,它在各种浏览器上都是同质的。Safari没有处理日期类型输入的标准组件。用户没有被要求遵守格式,他使用小部件选择日期。我想尝试找到JavaScript组件的正确输入/输出配置,以及在.blade视图(可能还有模型)的输入值中使用的配置,以便在数据读取之间自动进行格式转换,呈现和写入阶段。在日期选择器设置中有inputFormat和outputFormat,这是设置用户格式和数据库格式的地方。