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

Spring Boot+MySQL存储早于1970-01-02的OffsetDateTime报错求助

问题原因及解决方案:存储早于1970-01-02的日期失败

核心原因

MySQL的TIMESTAMP类型存在时间范围限制,它的有效存储范围是1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC。当你尝试存储的时间转换为UTC后超出这个范围时,就会触发Data truncation错误。

具体分析

你的MySQL实例以--default-time-zone=+00:00(UTC时区)启动,而你要存储的是**Asia/Kuala_Lumpur时区(+07:30)**的1970-01-01T00:00+07:30:

  1. 该时间转换为UTC时区的计算结果为:1970-01-01 00:00:00减去7小时30分,得到1969-12-31 16:30:00 UTC。
  2. 这个时间早于TIMESTAMP的最小有效值1970-01-01 00:00:01 UTC,因此MySQL拒绝存储,抛出数据截断错误。

而测试成功的1970-01-02T00:00+07:30转换为UTC后是1970-01-01 16:30:00 UTC,该时间在TIMESTAMP的有效范围内,所以可以正常存储。

解决方案

方案1:修改数据库字段类型为DATETIME

DATETIME类型的时间范围远大于TIMESTAMP(覆盖1000-01-01 00:00:00到9999-12-31 23:59:59),且它存储的是字面时间,不受时区转换的范围限制。执行以下SQL修改表结构:

ALTER TABLE students MODIFY COLUMN birth_date DATETIME NULL DEFAULT NULL;

方案2:限制存储的时间范围(若必须使用TIMESTAMP)

如果坚持使用TIMESTAMP,则需要确保待存储的时间转换为UTC后不早于1970-01-01 00:00:01 UTC。对应Asia/Kuala_Lumpur时区的本地时间最小值为1970-01-01 07:30:01 +07:30,早于该时间的记录无法存入TIMESTAMP字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:41