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

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修改为DATETIME
    DATETIME的取值范围为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:04