谁知道MySQL中是否有这样的功能?
更新
这不会输出任何有效信息:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
或者也许MySQL本身不能确切知道使用的time_zone
,没关系,我们可以在这里涉及PHP
,只要我能得到有效的信息而不是像系统
...
最佳答案
来自手册(section 9.6):
The current values of the global and client-specific time zones can be retrieved like this:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Edit 如果 MySQL 设置为使用系统的时区,则上述返回 SYSTEM
,这没什么帮助。由于您使用的是 PHP,如果 MySQL 的答案是 SYSTEM
,那么您可以通过 date_default_timezone_get
询问系统 it's 使用哪个时区. (当然,正如 VolkerK 指出的那样,PHP 可能在不同的服务器上运行,但假设是,假设 Web 服务器和它正在与之通信的数据库服务器 设置为 [如果实际上不是 in] 相同的时区不是一个巨大的飞跃。)但请注意(与 MySQL 一样),您可以设置 PHP 使用的时区 (date_default_timezone_set
),这意味着它可能会报告与操作系统使用的值不同的值。如果您可以控制 PHP 代码,那么您应该知道自己是否这样做并且没问题。
但是 MySQL 服务器正在使用哪个时区的整个问题可能是切线的,因为询问服务器它所在的时区不会告诉您关于数据库中数据的绝对没有。请继续阅读以了解详细信息:
进一步讨论:
如果您可以控制服务器,当然可以确保时区是一个已知数量。如果您无法控制服务器,则可以像这样设置 连接 使用的时区:
set time_zone = '+00:00';
这会将时区设置为 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)
所以知道服务器的时区只对获取当前时间的函数很重要,例如now()
、unix_timestamp()
等。 ;它不会告诉您有关数据库数据中的日期使用的时区的任何信息。您可能会选择假设它们是使用服务器的时区编写的,但这种假设很可能是有缺陷的。要了解存储在数据中的任何日期或时间的时区,您必须确保它们与时区信息一起存储,或者(像我一样)确保它们始终采用 GMT。
为什么假设数据是使用服务器的时区写入有缺陷的?好吧,一方面,数据可能是使用设置不同时区的连接写入的。数据库可能已从一台服务器移动到另一台服务器,其中服务器位于不同的时区(当我继承一个从德克萨斯州搬到加利福尼亚州的数据库时,我遇到了这种情况)。但是即使数据是写在服务器上的,用它当前的时区,它仍然是模棱两可的。去年,在美国,夏令时于 11 月 1 日凌晨 2:00 关闭。假设我的服务器位于使用太平洋时区的加利福尼亚,并且我在数据库中有值 2009-11-01 01:30:00
。那是什么时候?那是太平洋夏令时间 11 月 1 日凌晨 1:30,还是太平洋标准时间 11 月 1 日凌晨 1:30(一小时后)?你完全没有办法知道。道德:始终在 GMT 中存储日期/时间(不执行 DST),并在必要时转换为所需的时区。
关于mysql - 如何获取 MySQL 的当前时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2934258/