我遇到了一个问题,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等中完全完成的),但我很想深究造成这种差异的原因,所以我们可以对其进行排序并防止团队中的其他人被绊倒。
有谁知道是否有一个非常基本的设置,我已经在这里看过,或知道什么可能导致这种差异?
谢谢!
您运行的是哪个版本的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