You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:01:18