一尘不染

如何获取MySQL的当前时区?

mysql

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

更新

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

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

或者也许MySQL本身不知道确切time_zone使用了什么,那很好,我们可以PHP在这里介入,只要我能获得不像SYSTEM


阅读 444

收藏
2020-05-17

共1个答案

一尘不染

从手册(第9.6节):

可以按以下方式检索全局时区和特定于客户时区的当前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;

编辑SYSTEM如果MySQL设置为系统时区的从属,则以上内容将返回,没有帮助。由于您使用PHP,如果从MySQL的答案是SYSTEM,你可以接着问什么时区系统

通过使用date_default_timezone_get。(当然,正如VolkerK指出的那样,PHP可能在不同的服务器上运行,但是按照假设,假设要与之通信的Web服务器和DB服务器 设置为
[如果实际上不在同一时区 ] 巨大的
飞跃。)但要注意(如MySQL的),你可以设置时区PHP使用(date_default_timezone_set),这意味着它可能报告的值与操作系统正在使用的值不同。如果您可以控制PHP代码,则应该知道自己是否正在这样做,并且可以。

但是关于MySQL服务器使用哪个时区的整个问题可能是切线,因为询问服务器它所在的时区 绝对不会 告诉您关于数据库中数据的 任何
信息。继续阅读以获取详细信息:

进一步讨论

当然,如果您控制服务器,则可以确保时区为已知数量。如果您不受服务器的控制,则可以这样设置 连接 使用的时区:

set time_zone = '+00:00';

这样now()会将时区设置为GMT,以便任何进一步的操作(如)都将使用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)

因此,了解服务器的时区是在该获取时间功能方面唯一重要的权利,比如now()unix_timestamp()等;
它不会告诉您数据库数据中的日期正在使用哪个时区。您可能会选择 假设
它们是使用服务器的时区编写的,但是这种假设很可能是有缺陷的。要知道数据中存储的任何日期或时间的时区,您必须确保它们与时区信息一起存储,或者(就像我一样)确保它们始终位于格林尼治标准时间。

为什么假设数据是使用服务器的时区写入的?好吧,一方面,数据可能是使用设置了不同时区的连接写入的。该数据库可能已从一台服务器移至另一台服务器,其中服务器位于不同的时区(当我继承从德克萨斯州移至加利福尼亚州的数据库时遇到了这种情况)。但是,
即使
将数据写入服务器(具有当前时区),它仍然是模棱两可的。去年,在美国,夏令时于11月1日凌晨2:00被关闭。假设我的服务器使用太平洋时区在加利福尼亚州,我有这个价值2009-11-01 01:30:00在数据库中。那是什么时候?是太平洋标准时间11月1日凌晨1:30,还是太平洋标准时间11月1日凌晨1:30(一个小时后)?您绝对无法知道。道德:始终将日期/时间存储在GMT中(不执行DST),并在必要时将其转换为所需的时区。

2020-05-17