问答中心分类: MYSQL如何获取 MySQL 的当前时区?
0
匿名用户 提问 1月 前

有人知道MySQL中是否有这样的功能吗?
更新
这不会输出任何有效信息:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

或者也许 MySQL 本身不能确切地知道time_zone用过,没关系,我们可以参与PHP在这里,只要我能得到不喜欢的有效信息SYSTEM

VolkerK 回复 1月 前

“我们可以在这里涉及 PHP” – 那个 php 实例是否总是与 MySQL 服务器在同一台机器上?

VolkerK 回复 1月 前

是的,它们将在同一台机器上。

VolkerK 回复 1月 前

尝试@@system_time_zone正如我在下面的回答中所述。

VolkerK 回复 1月 前

由于提出了问题,因此添加了更多答案,也许重新考虑接受的答案?

VolkerK 回复 1月 前

即使 MySQL 服务器和 PHP 在同一台服务器上,它们也可能根据它们的设置选择不同的时区。这些时间可能与您的操作系统和 PHP/MySQL 显示的不同。

VolkerK 回复 1月 前

它确实输出有效信息,它告诉您 mysql 时区与您系统的时区相同

VolkerK 回复 1月 前

stackoverflow.com/questions/930900解释了如何在配置文件中覆盖 SYSTEMmy.cnf.根据部分[mysqld]添加default-time-zone='Pacific/Chatham'.

16 Answers
0
JohnZ 回答 1月 前

下面的查询返回当前会话的时区。

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
nilskp 回复 1月 前

这确实是正确的答案,因为它表明“SYSTEM”在转换中被识别为时区,因此完全足以将例如 NOW() 转换为任何时区。

jordanbtucker 回复 1月 前

谢谢,使用它我能够得到我想要的格式:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');

Jakub Vrána 回复 1月 前

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)更简单。

philfreo 回复 1月 前

或者SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);以秒为单位获得差异。

0
Andrew 回答 1月 前

简单地SELECT @@system_time_zone;
退货PST(或与您的系统相关的任何内容)。
如果您尝试确定会话时区,则可以使用此查询:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
如果会话时区与系统时区不同,它将返回会话时区。

Mark 回复 1月 前

唯一的缺点是,如果时区由于夏令时更改而更改,它仍然会报告在启动服务器时“记住”的时区,请参阅mysql 错误 9518

Timofeus 回复 1月 前

还有另一个缺点 – 看起来它在系统语言环境中返回一些东西,所以它可以显示类似 �������� ���� (����)

0
Timo Huovinen 回答 1月 前

作为雅库布·弗拉纳(创作者或行政非规范) 在评论中提到,选择当前时区偏移量TIME利用:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

它将返回:02:00:00如果您的时区在该日期是 +2:00
我在这里做了一个备忘单:MySQL 是否应该将其时区设置为 UTC?

philfreo 回复 1月 前

或者SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);以秒为单位获得差异。

ToolmakerSteve 回复 1月 前

@philfreo 的附加组件 – 请注意,与 TIMEDIFF 相比,TIMESTAMPDIFF 中的参数应颠倒过来。以这个答案中给出的例子为例,如果 TIMEDIFF 返回02:00:00,相应的 TIMESTAMPDIFF 将返回-2如果单位是 HOUR,-120如果单位是 MINUTE 等。要获得与时区相对应的符号,请交换参数:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())将返回预期的120时区 +2:00。指定分钟的原因是有几个时区偏移 30 或 45 分钟,请参阅en.wikipedia.org/wiki/Time_zone

supersan 回复 1月 前

这是一个比公认答案更好的答案,因为它直接回答了问题并给出了解决方案,而不仅仅是理论。

0
Abhinav bhardwaj 回答 1月 前

要获取 mysql 的当前时区,您可以执行以下操作:

SELECT @@system_time_zone;   # from this you can get the system timezone 
 SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) # This will give you time zone if system timezone is different from global timezone

现在,如果您想更改 mysql 时区,那么:

SET GLOBAL time_zone = '+00:00';   # this will set mysql timezone in UTC
 SET @@session.time_zone = "+00:00";  # by this you can chnage the timezone only for your particular session
0
Luca Fagioli 回答 1月 前

如果您需要 GMT 差异作为integer

SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Aidin 回复 1月 前

错误的。不适用于 IRST 等不是精确整数小时的时区。 (+3:30)timeanddate.com/time/zones/irst