Laravel 5.8中带AM/PM的日期转Y-m-d h:i:s格式报错解决
解决Laravel 5.8中自定义AM/PM日期格式转换与入库问题
你的问题根源有两个:一是原始日期字符串末尾多了个多余的.符号,二是parse()方法无法自动识别m.d.Y h:i:s A这种非标准日期格式,导致DateTime解析失败。下面给你分步拆解的解决方案:
步骤1:清理并精准转换日期格式
首先要移除日期末尾的无效符号,然后用Carbon的createFromFormat()方法明确指定原始格式,确保解析准确:
// 原始日期字符串 $date = "6.17.2019 12:00:00 AM."; // 1. 移除末尾的点(如果有其他不确定的末尾符号,用正则更灵活) $cleanDate = rtrim($date, '.'); // 2. 指定原始格式解析,再转换为目标格式 $regdate = \Carbon\Carbon::createFromFormat('m.d.Y h:i:s A', $cleanDate)->format('Y-m-d h:i:s'); // 此时$regdate的值就是你需要的:2019-06-17 00:00:00
如果原始日期的末尾符号不固定(比如有时有.有时没有),可以用正则批量清理非日期时间的末尾字符:
$cleanDate = preg_replace('/[^0-9:AMPM ]+$/', '', $date);
步骤2:Laravel 5.8数据库入库处理
在Laravel中存入日期有两种便捷方式,适配不同场景:
方式一:直接存入转换后的字符串
如果你的数据库字段类型是datetime或timestamp,直接将转换好的字符串赋值给模型属性即可:
$model = new YourModel(); $model->reg_date = $regdate; $model->save();
方式二:利用Laravel自动日期转换
Laravel模型支持自动处理日期字段,你可以在模型中通过$casts或$dates属性配置:
// 在你的模型类中 class YourModel extends Model { // 方式1:使用$casts明确指定字段类型(推荐) protected $casts = [ 'reg_date' => 'datetime', ]; // 方式2:使用$dates属性(Laravel 5.8兼容) // protected $dates = ['reg_date']; }
配置后,你甚至可以直接将Carbon实例赋值给模型属性,Laravel会自动转换成数据库所需格式:
$model->reg_date = \Carbon\Carbon::createFromFormat('m.d.Y h:i:s A', $cleanDate); $model->save();
额外小贴士
- 如果你频繁处理这类格式的日期,可以封装成辅助函数,比如在
app/helpers.php中:
function convertCustomDate($date) { $cleanDate = rtrim($date, '.'); return \Carbon\Carbon::createFromFormat('m.d.Y h:i:s A', $cleanDate)->format('Y-m-d h:i:s'); }
- 注意
h是12小时制格式,如果你需要24小时制的时间,只需把目标格式改成Y-m-d H:i:s即可,12:00:00 AM会自动转换为00:00:00,和你期望的结果一致。
内容的提问来源于stack exchange,提问作者Oops
相关产品推荐
相关产品推荐

