MySQL下时区调整及转换
在安装好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