MySQL 的 CURRENT_TIMESTAMP 显示不准确,通常是由于 时区设置不正确 或 系统时间与 MySQL 时间不一致 导致的。下面我将从多个方面帮你排查和解决这个问题。
NOW() 或 CURRENT_TIMESTAMP 获取的时间与实际时间不符(快/慢几个小时)。-- 查看 MySQL 当前时间
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
-- 查看 MySQL 时区设置
SELECT @@global.time_zone, @@session.time_zone;# 在 Linux 终端查看系统时间
date
timedatectl
✅ 正常情况:NOW() 应与系统时间一致。编辑 MySQL 配置文件(通常为 /etc/my.cnf 或 /etc/mysql/my.cnf):
[mysqld]
default-time-zone='+8:00'
# 或使用命名时区(需时区表已加载)
# default-time-zone='Asia/Shanghai'
⚠️ 修改后需重启 MySQL:
sudo systemctl restart mysql
# 或
sudo service mysql restart方法二:动态设置(临时生效)
-- 设置全局时区 SET GLOBAL time_zone = '+8:00'; -- 设置当前会话时区 SET time_zone = '+8:00';✅ 验证是否生效:SELECT NOW(); -- 应显示北京时间
✅ 3. 使用命名时区(更规范)
如果希望使用标准时区名称(如
Asia/Shanghai):步骤 1:加载时区表
# 在终端执行(Linux) mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql这会将系统时区信息导入 MySQL 的mysql.time_zone*表中。步骤 2:设置时区
[mysqld] default-time-zone='Asia/Shanghai'或动态设置:
SET GLOBAL time_zone = 'Asia/Shanghai';
-- 存储 UTC 时间
INSERT INTO logs(created_at) VALUES(UTC_TIMESTAMP());
-- 查询时转换为北京时间
SELECT CONVERT_TZ(created_at, 'UTC', 'Asia/Shanghai') FROM logs;
✅ 优点:避免时区混乱,适合多时区系统。
# 查看当前系统时区
timedatectl
# 设置为上海时区(Linux)
sudo timedatectl set-timezone Asia/Shanghai
MySQL 依赖系统时区,系统时间不准会影响 MySQL。
| 检查项 | 命令/操作 | 正确值示例 |
|---|---|---|
| 系统时间 | date | Fri Aug 22 12:00:00 CST 2025 |
| MySQL 当前时间 | SELECT NOW(); | 2025-08-22 12:00:00 |
| MySQL 全局时区 | SELECT @@global.time_zone; | +08:00 或 Asia/Shanghai |
| MySQL 会话时区 | SELECT @@session.time_zone; | 同上 |
| 配置文件设置 | my.cnf 中 default-time-zone | +8:00 或 Asia/Shanghai |
| 问题原因 | 解决方案 |
|---|---|
| 时区未设置 | 在 my.cnf 中设置 default-time-zone='+8:00' |
| 使用 UTC 时间 | 动态设置 SET time_zone = '+8:00'; |
| 时区名称不支持 | 执行 mysql_tzinfo_to_sql 加载时区表 |
| 系统时间不准 | 使用 timedatectl set-timezone Asia/Shanghai |
# my.cnf
[mysqld]
default-time-zone='Asia/Shanghai'
log_timestamps='SYSTEM' # 日志时间也用本地时区
重启 MySQL 后执行:
SELECT NOW(); -- 应显示正确北京时间