Mysql FROM_UNIXTIME为UTC

时间:2013-08-16 15:19:33

标签: mysql timezone

我怎样才能获得

FROM_UNIXTIME

在mysql中作为UTC / GMT?日期以连接的时区返回。

我不想更改连接的时区。

4 个答案:

答案 0 :(得分:18)

最好提前设定时区:

SET time_zone='UTC';
select FROM_UNIXTIME(1277942400);

原因是涉及本地时区的转换可能是有损的。 docs here中有一个例子(参见UNIX_TIMESTAMP()部分下的第4段,以“注意:”开头)

答案 1 :(得分:17)

我的解决方案是

SELECT CONVERT_TZ(FROM_UNIXTIME(1277942400), @@session.time_zone,'UTC')

如果CONVERT_TZ返回null,请确保填充mysql的时区表:

zypper install mysql-community-server-tools
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

答案 2 :(得分:2)

我知道这已经得到了解答,但我仍然愿意做出贡献:

如果您的服务器不能使用NOW()FROM_UNIXTIME()等函数生成UTC时区时间,则必须设置time_zone,如@Matt Johnson所说。

他没有提到:SET time_zone = timezone;仅设置当前连接的时区。 如果您希望这些函数默认以UTC格式返回/转换日期,请使用SET GLOBAL time_zone = '+00:00',这样您就不必在每次要保存某些基于UTC的日期时设置时区。

检查您当前的time_zone设置:SELECT @@global.time_zone, @@session.time_zone;

MySQL :: MySQL 5.5 Reference Manual :: 10.6 MySQL Server Time Zone Support

答案 3 :(得分:0)

如果您像我一样懒惰,并且不想更改全局会话时区变量(移至另一台服务器,忘记在那更改并跳,您就麻烦了),会话变量(使用某些模块自动重新连接到db和跃点,您在连接处发出的变量不见了)并且不想加载时区的东西,那么我想这可能会有所帮助:)。

select 
  now() as timezoned,
  date_add(
    FROM_UNIXTIME(0), interval 
      unix_timestamp()+TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP()) SECOND
  ) as utc

,即使使用负时间戳也可以使用。如果需要转换特定的列,只需将unix_timestamp()替换为包含时间戳的列即可。

作为奖励,如果您需要查找日期时间与现在之间的差异,而该列位于unix_timestamp中(例如,“ utc”),则只需将其与TIMESTAMPdiff(SECOND,..,NOW())和一天被保存了:)。