我怎样才能得到
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()
如果您不希望您的服务器使用诸如等功能生成 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;
如果您像我一样懒惰并且不想更改全局会话时区变量(移动到另一台服务器,忘记在那里更改并跳转,您遇到了麻烦),会话变量(使用了一些模块自动重新连接到数据库并跳转,您的连接时发出的变量消失了)并且不希望加载时区的东西那么我想这可能会有所帮助:)。
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()) 并保存这一天:)。