PHP和MySQL之间的时区差异

时间:2010-03-03 18:54:52

标签: php mysql date timezone

我遇到了一个问题,即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

假设时区为GMT,PHP给出的时间戳似乎是给定日期的correct one。如果我们运行BST,那么MySQL的结果将是正确的(当时时间戳在GMT + 1内)。

如果我从今天开始使用$timestamp1267640942)尝试上述内容,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等中完全完成的)但是我想深入了解造成这种差异的原因,以便我们可以解决它并防止团队中的其他任何人被它绊倒。

有没有人知道我在这里有一个非常基本的设置,或者知道可能导致这种差异的原因是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

我使用这种方法:

照顾PHP并单独留下mysql

建议通过date_default_timezone_set php函数为php设置默认时区。

使用TIMESTAMP字段类型在mySql中保留日期记录

然后当你插入:

$sDate = date("Y-m-d H:i:s");
mysql_query("insert into `table` set `created_on` = '$sDate' ");

当你选择:

mysql_query("select `created_on` from `table` ");
$iTime = strtotime($aRow['created_on']);

您始终可以使用gmdate php函数访问全球时间:

$iTime_Global = gmdate("U", $iTime);
如果您只是处理PHP代码,那么mysql时区对您的应用程序没有任何影响。 (由时区设定)

答案 1 :(得分:1)

我建议在您的服务器上使用UTC并安装MySQL并将时区转换为您想要的。 MySQL和PHP的转换非常简单。