我觉得这个可能有用:
MySQL中有三个地方可以设置时区:
在[mysqld]部分的“my.cnf”文件中
default-time-zone='+00:00'
@@global。time_zone变量
要查看它们被设置为什么值:
SELECT @@global.time_zone;
要为它设置一个值,可以使用其中任何一个:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';
(使用像“欧洲/赫尔辛基”这样的命名时区意味着你必须有一个正确填充的时区表。)
记住+02:00是一个偏移量。欧洲/柏林是一个时区(有两个偏移量),CEST是一个时钟时间,对应于特定的偏移量。
@@session。time_zone变量
SELECT @@session.time_zone;
要设置它,可以使用任何一个:
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
两者都可能返回SYSTEM,这意味着它们使用my.cnf中设置的时区。
要使时区名称生效,必须设置需要填充的时区信息表:http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html。在这个回答中,我还提到了如何填充这些表。
获取当前时区偏移量为TIME
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
如果您的时区是+2:00,它将返回02:00:00。
获取当前UNIX时间戳:
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
获取时间戳列作为UNIX时间戳
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
获取一个UTC datetime列作为UNIX时间戳
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
注意:改变时区不会改变存储的日期时间或时间戳,但它会为现有的时间戳列显示不同的日期时间,因为它们在内部存储为UTC时间戳,而在外部显示为当前MySQL时区。
我在这里做了一个备忘单:MySQL是否应该将它的时区设置为UTC?