从手册(第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),并在必要时将其转换为所需的时区。