如何获取MySQL的当前时区?

use*_*729 186 mysql timezone

谁知道MySQL中是否有这样的功能?

UPDATE

这不会输出任何有效信息:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

或者也许MySQL本身无法准确知道所time_zone使用的,那很好,我们可以参与PHP这里,只要我能得到有效的信息不喜欢SYSTEM......

T.J*_*der 212

从手册(第9.6节):

可以像下面这样检索全局和客户端特定时区的当前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;

编辑SYSTEM如果将MySQL设置为系统时区的slave,则上面返回,这不太有用.由于您使用的是PHP,如果MySQL的答案是SYSTEM,您可以询问系统使用的时区date_default_timezone_get.(当然,正如VolkerK所指出的那样,PHP可能在不同的服务器上运行,但是假设,假设它正在与之交谈的Web服务器和数据库服务器设置为 [如果不是实际存在 ]同一时区不是巨大的飞跃.)但要注意(与MySQL一样),您可以设置PHP使用的时区(date_default_timezone_set),这意味着它可能报告与操作系统使用的值不同的值.如果您掌握了PHP代码,那么您应该知道自己是否这样做并且没问题.

但是MySQL服务器正在使用的时区的整个问题可能是切线,因为询问服务器它所在的时区对数据库中的数据一无所知.继续阅读详情:

进一步讨论:

如果您控制服务器,当然可以确保时区是已知数量.如果您无法控制服务器,可以设置连接使用的时区,如下所示:

set time_zone = '+00:00';
Run Code Online (Sandbox Code Playgroud)

这将时区设置为GMT,以便任何进一步的操作(如now())将使用GMT.

但请注意,时间和日期值不会与MySQL中的时区信息一起存储:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

因此,了解服务器的时区是在该得到的时间,现在的功能,如条款唯一重要的now(),unix_timestamp()等等; 它没有告诉您有关数据库数据中的日期使用的时区的任何信息.您可以选择假设它们是使用服务器的时区编写的,但这种假设可能存在缺陷.要知道存储在数据的任何日期或时间的时区,你必须确保它们存储与区信息或(像我一样),确保他们总是在GMT.

为什么假设数据是使用服务器的时区写的?嗯,首先,数据可能是使用设置不同时区的连接编写的.该数据库可能已经从一个服务器到另一个服务器,其中服务器是在不同的时区(我遇到了,当我继承了已经从德州搬到加州数据库)移动.但即使数据写在服务器上,当前的时区也是如此,它仍然是模棱两可的.去年,在美国,夏令时于11月1日凌晨2点被关闭.假设我的服务器使用太平洋时区在加利福尼亚,我有值2009-11-01 01:30:00在数据库中.那是什么时候?这是太平洋标准时间11月1日凌晨1:30,或太平洋标准时间11月1日凌晨1:30(一小时后)?你完全没办法知道.道德:始终将日期/时间存储在GMT(不执行DST)并在必要时转换为所需的时区.

  • @ user198729:它不是*毫无意义*,虽然它没有我希望的那么有用.它的意思是:问问操作系统,MySQL正在为此而努力. (5认同)

小智 176

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

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
Run Code Online (Sandbox Code Playgroud)

  • `SELECT TIMEDIFF(NOW(),UTC_TIMESTAMP)`更简单. (87认同)
  • 这确实是正确的答案,因为它表明'SYSTEM'被认为是转换中的时区,使得它足以将例如NOW()转换为任何时区. (5认同)
  • 谢谢,使用这个,我能够得到我想要的格式:`select time_format(timediff(now(),convert_tz(now(),@@ session.time_zone,'+ 00:00')),'%H%i ");` (5认同)
  • 或者`SELECT TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP);`以秒为单位获得差异. (3认同)

And*_*rew 85

只是 SELECT @@system_time_zone;

返回PST(或与您的系统相关的任何内容).

如果您要确定会话时区,可以使用此查询:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

如果会话时区与系统时区不同,则返回会话时区.

  • 唯一的缺点是,如果由于夏令时变化而导致时区发生变化,它仍然会报告启动服务器时"记住"的时区,请参阅[mysql bug 9518](http://bugs.mysql.com /bug.php?id=9518) (4认同)

Tim*_*nen 59

正如JakubVrána(创建者或AdminerNotORM)在评论中提到的,选择当前TIME使用的时区偏移量:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

它将返回:02:00:00如果您的时区是该日期的+2:00

我在这里做了一个备忘单:MySQL的时区应该设置为UTC吗?


ttr*_*asn 12

任何人都可以找到 mysql db 的时区。

通过此查询,您可以获得当前时区:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

Run Code Online (Sandbox Code Playgroud)


Luc*_*oli 6

SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Run Code Online (Sandbox Code Playgroud)

这将返回时区作为整数(例如:) -6,处理正或负时间(这里是EXTRACT发挥HOUR作用的地方:单独的函数将负时区返回为正数).


Abh*_*waj 5

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

  1. SELECT @@ system_time_zone; //从这里你可以获得系统时区
  2. SELECT IF(@@ session.time_zone = 'SYSTEM',@@ system_time_zone,@@ session.time_zone)//这会给你的时区,如果系统时区是全球时区不同

现在,如果你想更改mysql时区,那么:1.SET GLOBAL time_zone ='+ 00:00'//这将在UTC 2中设置mysql时区.SET @@ session.time_zone ="+00:00"; //通过这个你可以只为你的特定会话设置时区


Ami*_*esh 5

描述中提到的命令返回“SYSTEM”,这表明它采用服务器的时区。这对我们的查询没有用。

以下查询将有助于了解时区

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;
Run Code Online (Sandbox Code Playgroud)

上述查询将为您提供相对于协调世界时 (UTC) 的时间间隔。这样您就可以轻松分析时区。如果数据库时区是 IST,输出将为 5:30

UTC_TIMESTAMP

在 MySQL 中,UTC_TIMESTAMP 将当前 UTC 日期和时间返回为“YYYY-MM-DD HH:MM:SS”或 YYYYMMDDHHMMSS.uuuuuu 格式的值,具体取决于函数的使用,即在字符串或数字上下文中。

现在()

NOW() 函数。MySQL NOW() 根据函数的上下文(数字或字符串)以“YYYY-MM-DD HH:MM:SS”格式或 YYYYMMDDHHMMSS.uuuuuu 格式返回当前日期和时间的值。CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()、LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP() 是 NOW() 的同义词。