3月9日MySQL插入因夏令时(DST)失败,请求验证故障理论
你的理论完全正确
核心原因分析
MySQL TIMESTAMP的时区特性:
MySQL的TIMESTAMP类型本质存储UTC时间,但会基于会话时区做双向转换:- 插入时:把传入的时间从会话时区转为UTC存储
- 查询时:把UTC存储值转回会话时区返回
夏令时切换的时间冲突:
北美东部时区(EST/EDT)在2024年3月10日当地时间2:00,时钟直接拨快到3:00,这意味着当地时间2:00-3:00的区间是完全不存在的无效时间。你的场景中的时区误解:
- 你把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
相关产品推荐
相关产品推荐

