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

3月9日MySQL插入因夏令时(DST)失败,请求验证故障理论

你的理论完全正确

核心原因分析

  1. MySQL TIMESTAMP的时区特性:
    MySQL的TIMESTAMP类型本质存储UTC时间,但会基于会话时区做双向转换:

    • 插入时:把传入的时间从会话时区转为UTC存储
    • 查询时:把UTC存储值转回会话时区返回
  2. 夏令时切换的时间冲突:
    北美东部时区(EST/EDT)在2024年3月10日当地时间2:00,时钟直接拨快到3:00,这意味着当地时间2:00-3:00的区间是完全不存在的无效时间。

  3. 你的场景中的时区误解:

    • 你把EST的21:30转换为UTC的02:30(对应3月10日)并发送给MySQL
    • 但MySQL会话时区是EST/EDT,它会默认把收到的02:30当成本地时区(EDT)的时间,而非UTC
    • 由于EDT的02:30是不存在的无效时间,MySQL在尝试将其转换为UTC时直接抛出Incorrect datetime value错误,完全符合你的推测。

验证步骤(可自行测试)

执行以下SQL可复现相同报错:

-- 设置会话时区为EST/EDT
SET time_zone = 'America/New_York';

-- 插入无效本地时间,触发相同错误
INSERT INTO your_table (received_timestamp) VALUES ('2024-03-10 02:30:00');

解决方法

  • 修改JDBC连接URL:添加serverTimezone=UTC参数,强制会话时区为UTC,让MySQL直接存储你发送的UTC时间,无需额外转换:
    jdbc:mysql://your-host:3306/your-db?serverTimezone=UTC&useLegacyDatetimeCode=false
    
  • 确认驱动版本:使用MySQL JDBC驱动8.0+版本,它对java.time.Instant的支持更完善,能正确将Instant以UTC形式传递给MySQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:32