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

无法在MySQL数据库中保存特定datetime值的问题求助

问题分析与解决方案

错误原因

你遇到的这个错误是由于夏令时切换导致的无效时间戳。2023年3月26日凌晨2:00-3:00这个时间段,在很多采用夏令时的时区(比如欧洲中部时间CET/CEST、西欧时间WET/WEST等)是不存在的——当地时钟会从2:00直接跳转到3:00,所以2023-03-26 02:36:24这个时间在对应时区里是无效的,MySQL会判定为非法的datetime值,从而抛出1292错误。

解决步骤

1. 校验并修正无效时间

在Laravel中可以利用Carbon库来检测时间是否有效,并自动修正:

// 替换成你的应用时区,比如'Europe/Berlin'或'Asia/Shanghai'
$timeZone = config('app.timezone');
$postedAt = Carbon::parse('2023-03-26 02:36:24', $timeZone);

if (!$postedAt->isValid()) {
    // 无效时间自动加1小时,跳转到夏令时后的有效时间
    $postedAt->addHour();
}

// 之后用修正后的时间执行更新操作
YourModel::where('id', 934579)->update(['posted_at' => $postedAt]);

2. 统一时区配置(长期方案)

确保应用时区与数据库时区一致,并且优先使用UTC存储时间:

  • 在Laravel的config/app.php中设置'timezone' => 'UTC',业务层展示时再转换为用户时区。
  • 配置MySQL使用UTC时区:执行SET GLOBAL time_zone = '+00:00';,或者在my.cnf/my.ini中添加default-time-zone = '+00:00'后重启MySQL。

这样可以从根源上避免夏令时切换带来的无效时间问题。

3. 临时调整MySQL模式(不推荐长期使用)

如果需要快速临时解决,可以修改MySQL的sql_mode,移除对无效时间的严格校验:

SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

注意:此方法会降低数据校验的严格性,可能导致其他非法时间写入数据库,仅建议作为临时应急方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:42:42