Mysql FROM_UNIXTIME as UTC



如何获取

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_unixtimenowcurrent_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

相关内容

  • 没有找到相关文章

最新更新