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)

相关推荐
等....7 小时前
Minio使用
数据库
win x8 小时前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
迷枫7128 小时前
DM8 数据库安装实战:从零搭建达梦数据库环境(附全套工具链接)
数据库
XDHCOM9 小时前
PostgreSQL 25001: active_sql_transaction 报错原因分析,故障修复步骤详解,远程处理解决方案
数据库·sql·postgresql
卤炖阑尾炎9 小时前
PostgreSQL 日常运维全指南:从基础操作到备份恢复
运维·数据库·postgresql
daad77711 小时前
wifi_note
运维·服务器·数据库
计算机毕设vx_bysj686911 小时前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
吴声子夜歌11 小时前
ES6——正则的扩展详解
前端·mysql·es6
xixingzhe211 小时前
Mysql统计空间增量
数据库·mysql
程序员萌萌11 小时前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引