MySQL UTC时间

背景介绍

项目中为兼容多时区方案,MySQL设计数据库表时,对于时间的设置,最开始才用timeStamp类型

发现一个问题,MySQL TIMESTAMP 2038 限制(Y2038 问题)

概念介绍

UTC 是世界协调时间 ,不随地区变化的全球统一时间

时区是人为定义的,会因为国家规定、政策、夏令时而改变

Y2038时间限制的根源

TIMESTAMP 类型的底层存储逻辑是:将时间转换为 UTC 时间戳,并以32 位有符号整数存储

表达时间有限

32 位有符号整数的最大值:2^31 - 1 = 2147483647

对应 UTC 时间:2038-01-19 03:14:07

超出该值后,32 位整数会溢出为负数,导致时间回绕到 1901-12-13 20:45:52 UTC

所以在MySQL数据库设计中避免使用TIMESTAMP类型

其他数据库有无此限制

数据库 是否有 2038 限制(原生时间类型) 关键说明
MySQL ✅ 有(TIMESTAMP 类型) 普通 TIMESTAMP 基于 32 位整数,DATETIME/ BIGINT 无限制
MariaDB ✅ 有(普通 TIMESTAMP) 10.1+ 新增 TIMESTAMP WITH TIME ZONE(64 位),无 2038 限制
PostgreSQL 时间类型基于 64 位整数,范围覆盖 BC 4713 ~ AD 294276
Oracle DATE/TIMESTAMP 基于字节存储(非时间戳),范围 BC 4712 ~ AD 9999
SQL Server datetime/datetime2 无 2038 限制,smalldatetime 上限 2079(非 2038 问题)
SQLite 无(默认) 无专用时间类型,手动用 32 位整数存时间戳才会触发,64 位 / 字符串存储则无
DB2 TIMESTAMP 范围 0001-01-01 ~ 9999-12-31,无 2038 限制

结论,常见数据库中只有MySQL数据库会有此类问题

使用DateTime类型数据类型

MySQL连接配置

XML 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/your_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

目的: 无论数据库服务器在哪里,都让 JDBC 连接设为 serverTimezone=UTC

Spring Boot 全局使用 UTC

XML 复制代码
spring:
  jackson:
    time-zone: UTC
    date-format: yyyy-MM-dd'T'HH:mm:ss

目的: 防止 Jackson 自动转换时区,返回给前端的所有时间都是 UTC

java 复制代码
@Configuration
public class TimeZoneConfig {

    @PostConstruct
    public void setDefaultTimeZone() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

**目的:**需要设置 JVM 默认时区为 UTC

后台使用类型

推荐使用LocalDateTime,但Date也可以(不带时区,支持UTC)

相关推荐
龙腾AI白云42 分钟前
大语言模型:从语言理解到通用智能的跃迁
数据库·人工智能·机器学习·知识图谱
SelectDB1 小时前
快手基于 Apache Doris 千亿多模态检索的实践
大数据·数据库·数据分析
SelectDB1 小时前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
大数据·数据库·数据分析
这个DBA有点耶1 小时前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比
数据库·mysql·架构
李少兄2 小时前
数据库批量清理前置防御:如何严谨校验目标表是否存在
mysql
香吧香2 小时前
Docker Swarm 线上环境 MariaDB XA 悬停事务故障排查
mysql·异常
其实防守也摸鱼2 小时前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
小白男神2 小时前
MySQL进阶学习三(视图)
后端·mysql
TDengine (老段)3 小时前
TDengine 常见问题 TOP7
大数据·数据库·时序数据库·常见问题·tdengine·涛思数据
+VX:Fegn08953 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计