MySQL下时区调整及转换
2014-10-15 17:30:15 阿炯

本站赞助商链接,请多关照。 在安装好mysql后,发现其中的系统时区是正确的,但时区值与当前环境不一致(中国,东八区)。其配置文件是默认的。
mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+

上面是正确的时区,下面是这样的:
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | +00:00 |
+------------------+--------+

而'time_zone'应该是'+08:00'才对。

而服务器的软、硬件时间都是正确的,出现这个问题有下面的解决思路。时区这个参数变量具有系统与会话这两个级别范围。

在当前会话中修改时区:
SET time_zone='Asia/Shanghai';
这种写法在交互模式下是不支持的,只有用下面的方法。
SET [global|session] time_zone='+08:00';
或绝大多数情况下与系统一致:
set [global|session] time_zone='SYSTEM';

查询当前所使用的时区信息:
SELECT @@global.time_zone, @@session.time_zone;

如果出现了时区错误,可以通过在会话中设置全局时区参数即可修改(修改成功后重启后也是正常的),或在服务器的配置文件中指定(--default-time-zone='timezone')。

支持哪些时区是可以在主库(mysql.time_zone_*)中查到的,但这些表默认是空的,需要手动加入。

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p
在输入root密码后,将会在time_zone的一系列表中生成对应的记录。

mysql_tzinfo_to_sql also can be used to load a single time zone file or to generate leap second information:

To load a single time zone file tz_file that corresponds to a time zone name tz_name,invoke mysql_tzinfo_to_sql like this:
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql -p

时区转换函数:convert_tz
用于将日期时间字段的时区进行转换,下面为一个将已经生成错误的时区转换为正确的时区的用法:
select id,title,issue_dt,convert_tz(issue_dt,'utc','Asia/Shanghai') from foasite.content where year(issue_dt)=2009;

select id,title,issue_dt,convert_tz(issue_dt,'+00:00','+08:00') from foasite.content where year(issue_dt)=2009;

第一种写法好像没有能起到作用,查询到了该字段与实际时区之间确实有差异,下面来转换它们:
update foasite.content set issue_dt=convert_tz(issue_dt,'+00:00','+08:00') where year(issue_dt)=2009;


参考文档:

在php的主页上有所有相关的时区的写法:http://php.net/manual/en/timezones.php

MySQL Server Time Zone Support