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)

相关推荐
Nturmoils1 分钟前
订单号查出了三笔,我以为是数据脏了,其实是自己写错了
数据库
ZKNOW甄知科技5 分钟前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
TDengine (老段)20 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技20 分钟前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
这就是佬们吗30 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
吴声子夜歌31 分钟前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb
Database_Cool_1 小时前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
garuda herb1 小时前
生成专题页Blog--建立并返回 MySQL 数据库连接
python·mysql
流星白龙1 小时前
【Redis】1.Redis特性
数据库·redis·缓存
奶糖 肥晨1 小时前
DBeaver 安装与 MySQL 连接配置教程
数据库·mysql