MySQL 查询当前 GMT 时间

Posted

技术标签:

【中文标题】MySQL 查询当前 GMT 时间【英文标题】:MySQL query for current GMT time 【发布时间】:2011-01-16 12:40:05 【问题描述】:

这听起来很简单,但我无法弄清楚如何使用简单的 SELECT 语句以 GMT 形式返回当前时间。

我一直在尝试使用CONVERT_TZ() 根据服务器时区和 GMT 时区将 NOW() 转换为 GMT,但由于某种原因,当我输入文本时区时它返回 NULL。我得到结果的唯一方法是实际输入偏移量,这对于一个非常简单的操作来说太复杂了。这就是我的意思:

mysql> SELECT CONVERT_TZ(NOW(),@@global.system_time_zone,'GMT');
NULL

mysql> SELECT CONVERT_TZ(NOW(),'PST','GMT');
NULL

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00');
2010-02-13 18:28:22

我只需要一个简单的查询来返回格林威治标准时间的当前时间。提前感谢您的帮助!

【问题讨论】:

注意:如果您需要通用时间参考,请使用 UTC 时间。这是真正的参考,而不是 GMT。当夏令时开启时,后者会发生变化。 @culebron - 感谢您的建议!问题仍然存在。那么如何使用简单的 select 语句来获取当前的 UTC 时间? 【参考方案1】:

只需使用 UTC(不受夏令时影响)

SELECT UTC_TIMESTAMP();

旧内容供参考:

这应该可以,但是

SELECT CONVERT_TZ(NOW(),'PST','GMT');

我也得到了 NULL 结果。有趣的是,mysql 文档中的示例也返回 null

SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz 看来你在 mysql 中发现了一个错误。 (感谢 +Stephen Pritchard)

你可以试试:

SET @OLD_TIME_ZONE=@@TIME_ZONE;
SET TIME_ZONE='+00:00';
SELECT NOW();
SET TIME_ZONE=@OLD_TIME_ZONE;

好的并不是你想要的(它有 4 个查询,但只有一个选择 :-)

【讨论】:

@Rufinus - 很好,我没疯。 MySQL这么重要的功能怎么会有bug呢? UTC_TIMESTAMP() 正是我想要的。谢谢! 如果数据库以 UTC 保存记录并使用当前时区搜索它们会怎样?在一个时区一般是 gmt -1,6 个月后变成 gmt +1 ?? GMT 也不受夏令时的影响。我想这里的每个人都在寻找UTC_TIMESTAMP(),所以最好将你的最后一行移到答案的顶部。【参考方案2】:

CONVERT_TZ() 中没有错误

要使用 CONVERT_TZ(),你需要安装时区表,否则 MySql 返回 NULL。

从 CLI 以 root 身份运行以下命令

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

见http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

谢谢

http://www.ArcanaVision.com (SJP 2011-08-18)

【讨论】:

这几乎每次都对我有用,但这次convert_tz() 即使在时区更新后也会返回 NULL。奇怪的!我检查了 - timezone_xxx 表已满。我的服务器版本是 5.0.92,从源代码编译(我总是这样做)。以前从来没有遇到过这个问题... 刚填完zone表PST时区还是不存在的。我在***中阅读,由于夏令时,PST 似乎不足以定义时区。有些城市使用夏令时有些不使用。请参阅:en.wikipedia.org/wiki/Pacific_Time_Zone#Daylight_time。我使用的是 Pacific/Los_Angeles 而不是 PST(考虑 DST)。 我必须使用 'US/Pacific' 从我的 5.5.27 数据库上的 convert_tz() 获取非 NULL 值。我通过浏览 mysql.time_zone_name 表找到了这个字符串。【参考方案3】:

注意: GMT 可能有 DST UTC 没有夏令时

SELECT UTC_TIMESTAMP();

我在这里做了一个备忘单:Should MySQL have its timezone set to UTC?

【讨论】:

【参考方案4】:

获取当前 UTC 日期时间的可靠方法是:

SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+0:00')

【讨论】:

【参考方案5】:

看了上面所有的答案,看到转换为PST不可靠,我就用了这个:

DATE_SUB(user_last_login, INTERVAL 7 小时)

【讨论】:

这不考虑夏令时规则。【参考方案6】:

这应该可行 - 我认为您指定的时区错误。以芝加哥为例

SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT')

【讨论】:

要使用 CONVERT_TZ() 你需要安装时区表否则 MySql 返回 NULL !它们没有预装在 mysql 中【参考方案7】:

当源服务器时间戳未知但需要特定 tz 时,请执行以下操作:

select convert_tz(utc_timestamp(),'+05:00','+00:00')

这里以 CST 为例。 无论您在哪里查询,utc_timestamp 都将保证“+00:00”的结果。 '+05:00' 是您想要的偏移量。 这在访问多个未知服务器时效果很好,并且可以确保您返回的结果都将在一个通用的 tz 结果集中。

【讨论】:

【参考方案8】:

我正在搜索我的时区,即 GMT+6(亚洲/达卡时区)

MySQL 服务器在美国。以下对我有用。

SELECT CONVERT_TZ(UTC_TIMESTAMP(), '+06:00', '+00:00')

【讨论】:

【参考方案9】:

CONVERT_TZ 函数没有错误。你得到 NULL 因为你使用时区名称/缩写。除非您安装 mysql.time_zone_name 表,否则 Mysql 不知道这个 'GMT'、'PST' 等是什么意思。但是,如果您使用数字,它将始终有效。

mysql> SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT');

返回 NULL

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00');

返回 2016-06-24 17:58:33

【讨论】:

出于某种原因,它需要在“来自时区”参数中使用“+”或“-”。 mariadb > SELECT CONVERT_TZ(NOW(),'-08:00','00:00');返回 NULL

以上是关于MySQL 查询当前 GMT 时间的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中从 EDT 转换为 GMT+05.30 时区以在 mysql 数据库中输入时间戳

mysql_关于CST和GMT时区时间转换

什么是mysql 的时间戳

mysql修改和查看时区(十五)

获取当前 GMT 时间

MySQL默认时间格式是UTC还是GMT?