Spring Boot中LocalDateTime.withYear()存MySQL Timestamp报错如何处理
你遇到的报错本质是MySQL的TIMESTAMP类型有严格的取值范围限制:TIMESTAMP存储的是自1970-01-01 00:00:00 UTC的秒数,最大支持到2038-01-19 03:14:07 UTC,你设置的2500年、3021年远超出该范围,因此MySQL会抛出数据截断错误,和Java端的LocalDateTime.withYear()方法本身无关。
首选方案:将MySQL对应字段的类型从
TIMESTAMP修改为DATETIMEDATETIME的取值范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,完全覆盖你需要的大年份场景,且Spring Boot的JDBC、JPA、MyBatis等持久层框架都原生支持DATETIME类型和LocalDateTime的直接映射,不需要修改Java业务代码,仅修改表结构即可:ALTER TABLE 你的表名 MODIFY COLUMN 你的时间字段名 DATETIME NOT NULL COMMENT '时间字段';如果你的项目使用JPA自动建表,需要在对应实体类字段上指定列类型:
@Column(columnDefinition = "DATETIME") private LocalDateTime yourTimeField;特殊场景兼容方案:如果必须保留
TIMESTAMP类型(仅适用于有强制时区自动转换需求的场景)
在业务代码中添加时间范围校验,存入数据库前判断LocalDateTime是否落在TIMESTAMP的合法范围内,超出范围时直接抛出业务错误提示用户,避免触发数据库层面的截断异常。通用配置校验
确保你的JDBC连接串中已经配置了正确的时区参数,避免时区转换导致合法时间偏移出TIMESTAMP/DATETIME的取值范围:
示例连接参数:jdbc:mysql://127.0.0.1:3306/你的库名?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
内容的提问来源于stack exchange,提问作者Bence Kovács

