关于时区:MySQL时区

MySQL Time Zones

是否有一个详尽的MySQL时区列表?

似乎MySQL设置中time_zone的有效值取决于主机操作系统,但我无法找到可能值的列表。

我需要时间来展示卡尔加里当地时间。


默认情况下(至少在基于Debian的安装中)没有时区数据加载到MySQL中。如果要测试它们是否已加载,请尝试执行:

1
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

如果它返回DATETIME(在本例中为2012-06-07 08:00:00),则表示已加载时区。如果它返回NULL,则它们不是。未加载时,您只能使用偏移量进行转换(例如+10:00-6:00)。

在许多情况下这应该可以正常工作,但有时候使用指定的时区更好,比如不担心夏令时。执行以下命令从系统加载时区数据(仅限Unix。我不确定等效的Windows命令是什么):

1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

如果您需要不断依赖MySQL时区,则每次更新系统时区时都应执行上述命令。您也可以将其添加到每周或每月的cron作业中,以便自动为您完成。

然后,要查看时区列表,请执行以下操作:

1
2
USE mysql;
SELECT * FROM `time_zone_name`;

请注意,MySQL中的时区信息占用大约5 MB。如果您想要卸载时区信息,只需执行以下命令并重新启动MySQL:

1
2
3
4
5
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

不要DROP这些表或坏事都会发生。

编辑:

根据下面的用户注释,如果您希望在更新系统时自动更新时区,则首先需要允许root用户登录而不提示输入密码。

MySQL> = 5.6.6

执行以下:

1
mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6

创建~/.my.cnf文件(如果它尚不存在)并添加以下内容:

1
2
3
[client]
user=root
password=yourMysqlRootPW

然后执行chmod 600 ~/.my.cnf以确保没有其他人可以读取它。

更新脚本

将以下脚本添加到crontab,每天执行一次:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24  
# hours and do not have".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo"Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo"Done!
"

fi

如果您不想要任何输出,请删除echo行。

注意:这(大部分)未经测试。如果您有任何问题,请告诉我,我会更新此答案。


从MySQL 5.7文档(强调我的):

timezone values can be given in several formats, none of which are
case sensitive:

The value 'SYSTEM' indicates that the time zone should be the same as
the system time zone.

The value can be given as a string indicating an offset from UTC, such
as '+10:00' or '-6:00'.

The value can be given as a named time zone, such as
'Europe/Helsinki', 'US/Eastern', or 'MET'. Named time zones can be
used only if the time zone information tables in the mysql database
have been created and populated.

需要注意的是MySQL时区变量的默认设置是MySQL启动时的SYSTEM。 SYSTEM值是从操作系统设置获得的(例如,从符号链接/etc/localtime引用的文件)

通过提供以下命令行选项,可以在启动时将MySQL的默认时区变量初始化为不同的值:

1
--default-time-zone=timezone

或者,如果要在选项文件中提供值,则应使用以下语法设置变量:

1
--default-time-zone='timezone'

如果您是MySQL SUPER用户,可以使用以下语法在MYSQL>提示符下在运行时设置SYSTEM time_zone变量:

1
SET GLOBAL time_zone=timezone;

MySQL还支持单个SESSION时区值,默认为GLOBAL time_zone环境变量值。要在SESSION期间更改会话时区值,请使用以下语法:

1
SET time_zone=timezone;

为了询问现有的MYSQL时区设置值,您可以执行以下SQL来获取这些值:

1
SELECT @@global.time_zone, @@session.time_zone;

为了它的价值,我只是用谷歌搜索mysql time_zone配置有效值并查看第一个结果。


可以从MySQL的网站下载详尽的时区列表,作为导入MySQL服务器的数据库表。

对于卡尔加里时间,您可以将UTC偏移指定为

1
set time_zone = '-6:00';


需要注意的是MySQL时区变量的默认设置是MySQL启动时的SYSTEM。 SYSTEM值是从操作系统的GLOBAL time_zone环境变量中获取的。

通过提供以下命令行选项,可以在启动时将MySQL的默认时区变量初始化为不同的值:

1
--default-time-zone=timezone

或者,如果要在选项文件中提供值,则应使用以下语法设置变量:

1
--default-time-zone='timezone'

如果您是MySQL SUPER用户,可以使用以下语法在MYSQL>提示符下在运行时设置SYSTEM time_zone变量:

1
SET GLOBAL time_zone=timezone;

MySQL还支持单个SESSION时区值,默认为GLOBAL time_zone环境变量值。要在SESSION期间更改会话时区值,请使用以下语法:

1
SET time_zone=timezone;

为了询问现有的MYSQL时区设置值,您可以执行以下SQL来获取这些值:

1
SELECT @@global.time_zone, @@session.time_zone;

唯一的答案是:
http://timezonedb.com/download

文本以使此答案有效