37

我怎样才能得到

FROM_UNIXTIME

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

我不想更改连接的时区。

4

4 回答 4

33

您最好提前设置时区:

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

原因是涉及本地时区的转换可能是有损的。此处的文档中有一个示例(请参阅UNIX_TIMESTAMP()以“注意:”开头的部分下的第 4 段)

于 2013-08-16T15:41:25.580 回答
25

我的解决方案是

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
于 2013-08-16T15:21:46.103 回答
2

我知道这已经得到解答,但我仍然想贡献:

NOW()如果您不希望您的服务器使用诸如等功能生成 UTC 时区时间FROM_UNIXTIME(),则必须设置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 参考手册 :: 10.6 MySQL 服务器时区支持

于 2017-07-19T13:06:33.870 回答
1

如果您像我一样懒惰并且不想更改全局会话时区变量(移动到另一台服务器,忘记在那里更改并跳转,您遇到了麻烦),会话变量(使用了一些模块自动重新连接到数据库并跳转,您的连接时发出的变量消失了)并且不希望加载时区的东西那么我想这可能会有所帮助:)。

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()) 并保存这一天:)。

于 2019-12-26T10:22:51.000 回答