【发布时间】:2013-08-19 01:32:05
【问题描述】:
如何获得
FROM_UNIXTIME
在 mysql 中作为 UTC/GMT?日期以连接的时区返回。
我不想更改连接的时区。
【问题讨论】:
如何获得
FROM_UNIXTIME
在 mysql 中作为 UTC/GMT?日期以连接的时区返回。
我不想更改连接的时区。
【问题讨论】:
你最好提前设置时区:
SET time_zone='UTC';
select FROM_UNIXTIME(1277942400);
原因是涉及本地时区的转换可能是有损的。在docs here 中有一个例子(参见UNIX_TIMESTAMP() 部分下的第4 段,以“注意:”开头)
【讨论】:
SET time_zone = '+00:00' 为我工作。如果您希望保留它,请参阅 Mārtiņš Radiņš 答案。
SET time_zone='America/Los_Angeles';SELECT FROM_UNIXTIME(inserted_at) FROM activity;
我的解决方案是
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 Reference Manual :: 10.6 MySQL Server Time Zone Support
【讨论】:
如果你像我一样懒惰并且不想更改全局会话时区变量(移动到另一台服务器,忘记在那里更改并跳转,你有麻烦了),会话变量(使用了一些模块自动重新连接到 db 和跳,您在连接时发出的变量已经消失)并且不希望加载时区的东西,那么我想这可能会有所帮助:)。
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()) 和节省了一天:)。
【讨论】: