如何在不修改系统时钟的情况下将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]段添加以下配置:
保存后重启MySQL服务即可。注意:[mysqld] system_time_zone = UTC default_time_zone = UTCsystem_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确认会话时区:
若结果不是UTC,可在应用初始化时执行SELECT @@session.time_zone;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
相关产品推荐
相关产品推荐

