PHP和MySQL之间的时区差异
我遇到了一个问题,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之内)。
如果我从今天开始使用$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 |
+--------------------+---------------------+
我的web服务器上的默认时区是GMT。这也是我的数据库服务器上的默认系统时区(根据在每台服务器上运行的date
命令)。
[email protected]:/home/foo$ date
Wed Mar 3 18:45:02 GMT 2010
所以根据文档,我的DB服务器应该在格林尼治标准时间,这是我们所希望的运行。然而,在我的测试脚本中给出的查询输出表明它在GMT + 1中运行。
我知道这个问题有很多解决方法(所有的日期算法都是在PHP或MySQL等中完全完成的),但我很想深究造成这种差异的原因,所以我们可以对其进行排序并防止团队中的其他人被绊倒。
有谁知道是否有一个非常基本的设置,我已经在这里看过,或知道什么可能导致这种差异?
谢谢!
我会建议在你的服务器上使用UTC,MySQL会安装并将时区转换为你想要的。 MySQL和PHP中的转换非常简单。
- http://www.w3schools.com/php/php_ref_date.asp(getTimeZone获取和setTimezone)
- http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
我用这个方法:
照顾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的时区在你的应用程序中将不起作用。 (由时区设置)
您运行的是哪个版本的PHP? – blockhead 2010-03-03 18:58:31
@blockhead PHP 5.2.0 – ConroyP 2010-03-03 19:01:39
你有没有在你的mysql连接上显式地使用set time_zone = ...? – roman 2010-03-03 19:47:22