我怎样才能获得
FROM_UNIXTIME
在mysql中作为UTC / GMT?日期以连接的时区返回。
我不想更改连接的时区。
答案 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())和一天被保存了:)。