如何获取
FROM_UNIXTIME
作为mysql中的UTC/GMT?返回的日期为连接的时区。
我不想更改连接的时区。
您最好提前设置时区:
SET time_zone='UTC';
select FROM_UNIXTIME(1277942400);
原因是涉及本地时区的转换可能会有损耗。这里的文档中有一个这样的例子(请参阅UNIX_TIMESTAMP()
部分下以"注意:"开头的第4段)
我的解决方案是
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
我知道这个问题已经得到了回答,但我仍然想贡献:
如果你不想让你的服务器用NOW()
和FROM_UNIXTIME()
等功能产生UTC时区时间,你必须像@Matt Johnson说的那样设置time_zone
。
有一件事他没有提到:SET time_zone = timezone;
只为当前连接设置时区。如果您希望这些函数在默认情况下以UTC返回/转换您的日期,请使用SET GLOBAL time_zone = '+00:00'
,这样您就不必每次保存一些基于UTC的日期时都设置时区。
检查您当前的时区设置:SELECT @@global.time_zone, @@session.time_zone;
MySQL::MySQL 5.5参考手册::10.6 MySQL Server时区支持
如果您无法控制会话的时区*,则from_unixtime
、now
、current_date
等将从根本上中断,应该避免。幸运的是,日期算法完全忽略了会话时区,所以你可以简单地做:
select '1970-01-01' + interval 1277942400 second
或等效
select date_add('1970-01-01', interval 1277942400 second)
*这可能很难;一些客户";有益的";将根据环境为您设置会话时区;其他客户端将自动重新建立断开的连接,因此您不能在连接时依赖于设置时区,必须使用每条语句设置时区
使用utc_timestamp()
/date(utc_timestamp())
代替now()
/current_date()
(如果需要,可以使用convert_tz转换到某个时区)。
如果你像我一样懒惰,不想更改全局会话时区变量(移动到另一台服务器,忘记在那里更改并跳转,你有麻烦了)、会话变量(使用了一些模块自动连接到数据库和跳转,在连接时发出的变量不见了),并且不想加载时区的东西,那么我想这可能会有所帮助:)。
select
now() as timezoned,
date_add(
FROM_UNIXTIME(0), interval
unix_timestamp()+TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP()) SECOND
) as utc
即使时间戳为负,它也会起作用。如果需要转换特定列,只需将unix_timestamp()替换为包含时间戳的列即可。
额外的一点是,如果您需要找到datetime和now之间的差异,而该列位于unix_timestamp(比如"utc")中,只需使用TIMESTAMPdiff(SECOND,..,now())将其包装即可保存日期:)。
更新:如果你生活在一个节省时间的地区,而且你的时间很快,我想出了一个更简单的办法。
选择nixtime(1277942400)作为时间分区,日期_add("1970-01-01 00:00:00",间隔1277942400秒)作为utc
更简单的是:)。
一个不太好的替代方案:
选择nixtime(1277942400)作为时间分区,日期_add(FROM_UNIXTIME(0),间隔1277942400+(UNIX_TIMESTAMP('1970-1-2')-UNIX_TIMESTAMP(0)-24*3600)第二)作为utc