从手册(第 9.6 节 http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html):
可以像这样检索全球时区和客户端特定时区的当前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Edit以上返回SYSTEM
如果MySQL设置为使用系统的时区,这没什么帮助。由于您使用的是 PHP,如果 MySQL 的答案是SYSTEM
,然后你可以询问系统什么时区it's使用通过date_default_timezone_get http://php.net/manual/en/function.date-default-timezone-get.php。 (当然,正如 VolkerK 指出的那样,PHP 可能运行在不同的服务器上,但作为假设,假设它正在通信的 Web 服务器和 DB 服务器是set to[如果实际上不是in] 同一时区不是huge)但要注意(与 MySQL 一样),您可以设置 PHP 使用的时区(date_default_timezone_set http://www.php.net/manual/en/function.date-default-timezone-set.php),这意味着它可能报告与操作系统正在使用的值不同的值。如果您可以控制 PHP 代码,您应该知道您是否正在这样做并且没问题。
但是 MySQL 服务器正在使用哪个时区的整个问题可能是一个切线,因为询问服务器它所在的时区会告诉你绝对没有关于数据库中的数据。继续阅读了解详细信息:
进一步讨论:
如果您控制服务器,当然您可以确保时区是已知数量。如果您无法控制服务器,您可以设置您的服务器使用的时区联系像这样:
set time_zone = '+00:00';
这会将时区设置为 GMT,以便任何进一步的操作(例如now()
)将使用 GMT。
但请注意,时间和日期值是notMySQL 中存储时区信息:
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()
, ETC。;它不会告诉您有关数据库数据中的日期使用的时区的任何信息。您可能会选择assume它们是使用服务器的时区编写的,但这种假设很可能是有缺陷的。要了解数据中存储的任何日期或时间的时区,您必须确保它们与时区信息一起存储,或者(像我一样)确保它们始终采用 GMT。
为什么假设数据是使用服务器时区写入的有缺陷?嗯,一方面,数据可能是使用设置不同时区的连接写入的。数据库可能已从一台服务器移动到另一台服务器,其中服务器位于不同的时区(当我继承从德克萨斯州移动到加利福尼亚州的数据库时,我遇到了这种情况)。但even if数据写在服务器上,以其当前时区,它仍然不明确。去年,美国于 11 月 1 日凌晨 2:00 关闭夏令时。假设我的服务器位于加利福尼亚州,使用太平洋时区,并且我有以下值2009-11-01 01:30:00
在数据库中。那是什么时候?那是太平洋标准时间 11 月 1 日凌晨 1:30,还是太平洋标准时间 11 月 1 日凌晨 1:30(一小时后)?你绝对没有办法知道。寓意:始终以 GMT(不执行 DST)存储日期/时间,并在必要时转换为所需的时区。