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

如何在不修改系统时钟的情况下将MySQL的system_time_zone设为UTC?

解决MySQL时区与夏令时导致的JVM时间错误问题

强制将MySQL的system_time_zone设为UTC

system_time_zone默认继承系统时区,但可通过启动配置强制固定为UTC:

  • 临时生效(重启后失效):
    重启MySQL时添加启动参数:
    mysqld --system-time-zone=UTC
    
  • 永久生效:
    编辑MySQL配置文件(如/etc/my.cnf),在[mysqld]段添加以下配置:
    [mysqld]
    system_time_zone = UTC
    default_time_zone = UTC
    
    保存后重启MySQL服务即可。注意:system_time_zone只能在MySQL启动时设置,运行时无法通过SET GLOBAL命令修改。

确保time_zone设置完全生效的补充措施

若不想修改system_time_zone,可通过以下方式强化time_zone的作用,避免夏令时冲突:

  • 修正JDBC连接参数:
    确保JDBC URL包含serverTimezone=UTC、connectionTimeZone=UTC和useLegacyDatetimeCode=false(MySQL 8.0驱动必须),示例:
    jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&connectionTimeZone=UTC&useLegacyDatetimeCode=false
    
  • 验证会话时区:
    应用连接数据库后,执行以下SQL确认会话时区:
    SELECT @@session.time_zone;
    
    若结果不是UTC,可在应用初始化时执行SET time_zone = 'UTC';强制设置会话时区。
  • 调整TIME字段存储策略:
    MySQL的TIME类型不带时区信息,其解析依赖system_time_zone,夏令时切换时易出现冲突。建议:
    • 将TIME字段改为DATETIME类型,统一存储UTC时间;
    • 应用层处理时间:读写时都将时间转换为UTC,避免依赖数据库时区。

问题根源说明

你之前配置的default_time_zone='UTC'仅设置了全局和会话的time_zone,但system_time_zone仍随系统时区变化。而TIME字段的解析会依赖system_time_zone,当系统切换到含夏令时的时区时,就会出现HOUR_OF_DAY: 0 -> 1这类夏令时丢失时段的错误。

内容的提问来源于stack exchange,提问作者virtualeyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:01:20