【问题标题】:Timezone differences between PHP and MySQLPHP 和 MySQL 之间的时区差异
【发布时间】:2011-01-23 08:44:22
【问题描述】:

我遇到了一个问题,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。如果我们运行 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 等中完全完成),但我很想了解导致这种差异的原因,以便我们可以解决它并防止团队中的任何其他人被它绊倒。

有谁知道我在这里忽略了一个非常基本的设置,或者知道是什么导致了这种差异?

谢谢!

【问题讨论】:

  • 你运行的是什么版本的 PHP?
  • 你试过在你的mysql连接上显式使用set time_zone=...吗?
  • 或者其他方式,php中的date_default_timezone_set

标签: php mysql date timezone


【解决方案1】:

我使用这种方法:

照顾好PHP,别管mysql

建议通过date_default_timezone_setphp函数设置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 时区将不会对您的应用程序产生任何影响。 (即由时区设置)

【讨论】:

    【解决方案2】:

    我建议在您的服务器上使用 UTC 并安装 MySQL 并将时区转换为您想要的任何时间。 MySQL 和 PHP 中的转换相当简单。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2015-07-13
      • 2011-09-24
      相关资源
      最近更新 更多