2010-03-03 140 views
1

我遇到了一个问题,PHP和MySQL似乎不同意在将某些时间戳转换回日期和时间时应该使用哪个时区。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给定的日期,假定时区为GMT。如果我们运行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    | 
+--------------------+---------------------+ 

我的web服务器上的默认时区是GMT。这也是我的数据库服务器上的默认系统时区(根据在每台服务器上运行的date命令)。

[email protected]:/home/foo$ date 
Wed Mar 3 18:45:02 GMT 2010 


所以根据文档,我的DB服务器应该在格林尼治标准时间,这是我们所希望的运行。然而,在我的测试脚本中给出的查询输出表明它在GMT + 1中运行。

我知道这个问题有很多解决方法(所有的日期算法都是在PHP或MySQL等中完全完成的),但我很想深究造成这种差异的原因,所以我们可以对其进行排序并防止团队中的其他人被绊倒。

有谁知道是否有一个非常基本的设置,我已经在这里看过,或知道什么可能导致这种差异?

谢谢!

+0

您运行的是哪个版本的PHP? – blockhead 2010-03-03 18:58:31

+0

@blockhead PHP 5.2.0 – ConroyP 2010-03-03 19:01:39

+0

你有没有在你的mysql连接上显式地使用set time_zone = ...? – roman 2010-03-03 19:47:22

回答

2

我用这个方法:

照顾PHP和离开MySQL的单独

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

使用保持最新记录时间戳字段类型在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的时区在你的应用程序中将不起作用。 (由时区设置)