【发布时间】:2011-01-23 08:44:22
【问题描述】:
我遇到了一个问题,PHP 和 MySQL 似乎在将某些时间戳转换回日期和时间时应该使用哪个时区存在分歧。
当我想要将时间戳转换回datetime 格式时,就会出现问题。 PHP 以 GMT 为时区给出日期和时间,但 MySQL 似乎认为它在 GMT+1 中运行,并相应地进行转换。
简单再现
$original_date = '2009-08-31 23:59:59';
$timestamp = strtotime($original_date);
echo $timestamp; // Gives 1251763199
echo date('Y-m-d H:i:s', $timestamp); // PHP: 2009-08-31 23:59:59
echo db_field('SELECT FROM_UNIXTIME(1251763199)'); // MySQL: 2009-09-01 00:59:59
假设时区是格林威治标准时间,PHP 给出的时间戳似乎是给定日期的correct one。如果我们运行 BST,MySQL 的结果将是正确的(当时给出的时间戳在 GMT+1 范围内)。
如果我从今天开始使用$timestamp (1267640942) 尝试上述操作,PHP 和 MySQL 似乎都乐意告诉我它是 2010-03-03 18:29:02(都返回 GMT)。
服务器上设置了什么时区?
我检查了the MySQL docs,上面说如果我的时区设置为system,那么操作系统将提供时区信息。目前看来是这样:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
我的网络服务器上的默认时区是 GMT。这也是我的数据库服务器上的默认系统时区(根据在每个服务器上的 cl 上运行的 date 命令)。
foo@bar:/home/foo$ date
Wed Mar 3 18:45:02 GMT 2010
所以根据文档,我的数据库服务器应该在 GMT 上运行,这正是我们想要的。然而,我的测试脚本中给出的查询输出表明它在 GMT+1 中运行。
我知道这个问题有很多解决方法(所有日期算术都在 PHP 或 MySQL 等中完全完成),但我很想了解导致这种差异的原因,以便我们可以解决它并防止团队中的任何其他人被它绊倒。
有谁知道我在这里忽略了一个非常基本的设置,或者知道是什么导致了这种差异?
谢谢!
【问题讨论】:
-
你运行的是什么版本的 PHP?
-
你试过在你的mysql连接上显式使用
set time_zone=...吗? -
或者其他方式,php中的date_default_timezone_set