我遇到了一个问题,即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内)。
如果我从今天开始使用$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等中完全完成的)但是我想深入了解造成这种差异的原因,以便我们可以解决它并防止团队中的其他任何人被它绊倒。
有没有人知道我在这里有一个非常基本的设置,或者知道可能导致这种差异的原因是什么?
谢谢!
答案 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的转换非常简单。