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

Laravel8部署服务器插入数据报Invalid datetime format错误如何解决

问题根因

报错由两个条件共同触发:

  • PHP 8.1 调整了DateTime对象的默认字符串序列化规则:8.0及更早版本中,DateTime实例转字符串默认输出Y-m-d H:i:s格式,不带时区后缀;8.1起携带时区信息的DateTime实例序列化时会自动输出带时区偏移的ISO8601格式,也就是报错里+00:00后缀的来源。
  • 服务器端MySQL开启了严格模式,且time_zone参数设为SYSTEM。Laravel迁移中$table->timestamps()生成的created_at、updated_at是DATETIME类型字段,该类型原生不支持带时区偏移的时间格式,严格模式下会直接抛出1292格式错误;本地环境无报错是因为本地MySQL未开启严格模式,会自动截断后缀部分,不会触发异常。

你当前PHP、Laravel的UTC时区配置是正确的,不需要调整时区相关参数,问题本质是时间格式与数据库字段要求不匹配。

修复方案

按推荐优先级从高到低排列:

  • 方案1:将Laravel 8框架升级到8.83.0及以上的8.x分支稳定版本。官方在该版本后已经完成PHP 8.1适配,会自动将时间戳序列化为Y-m-d H:i:s格式,完全匹配DATETIME字段要求,无需修改业务代码。
  • 方案2:暂时无法升级框架时,在全局模型基类(通常是app/Models/Model.php,所有业务模型都继承自该类)中重写时间格式化方法,强制指定存储格式:
/**
 * 定义模型时间戳的存储格式
 * @return string
 */
protected function getDateFormat(): string
{
    return 'Y-m-d H:i:s';
}

添加后所有模型的自动维护时间戳都会按该格式生成,不会再携带时区后缀。

  • 方案3(不推荐):关闭MySQL严格模式,跳过格式校验
    可以直接修改Laravel数据库配置,在config/database.php的mysql连接配置项中加入/修改:
'mysql' => [
    // 其余原有配置保持不变
    'strict' => false,
],

也可以直接修改MySQL配置文件my.cnf(Windows环境为my.ini),调整sql_mode参数移除STRICT_TRANS_TABLES项后重启MySQL服务。

注意:该方案仅让MySQL自动截断时间值的时区后缀,没有从根源解决格式不匹配问题,后续涉及时间查询、计算的场景可能出现时区偏差,非特殊情况不建议使用。

内容的提问来源于stack exchange,提问作者mstdmstd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:09:27