【问题标题】:time zone problem mysql时区问题mysql
【发布时间】:2010-11-22 16:13:46
【问题描述】:

我的服务器在美国,我在英国。

我使用默认的 CURRENT_TIMESTAMP 在 mysql 服务器上存储时间戳值。因此,当条目被添加到我的表时,它们会被标记为当前时间。这是服务器时间(美国),然后被mysql转换为UTC。

当我检索值时,我希望它们显示在当前时区(英国)中。所以在我的 PHP 中,我使用以下函数来设置当前时区:

mysql_query("SET time_zone = timezone;");

这似乎起作用,因为当我要求 mysql 回显服务器和会话时区时,我分别得到 SYSTEM 和 -08:00。

但是,当我稍后在同一个 PHP 脚本中打印我的时间戳值时,它们会以美国时间输出。

在 PHP 中获取结果:

$result = mysql_query("SELECT ID,DateTime,Name,Comment,Location,Rating FROM table1 WHERE Latitude<$latup AND Latitude>$latdown AND Longitude<$lngup AND Longitude>$lngdown ORDER BY DateTime DESC")

while(($row = mysql_fetch_array( $ratingresult )) && ($i++ < 1)) {
    echo "<tr><td>"; 
    echo $row['DateTime'];
    echo "</td><td>"; 
    echo $row['Name'];
    echo "</td><td>";
    echo $row['Comment'];
    echo "</td><td>";
    echo $row['Location'];
    echo "</td><td>";
    echo $row['Rating'];
    echo "</td><td>";
    rate($row, $lat, $lng);
    echo "</td></tr>"; 
} 

任何帮助将不胜感激!

【问题讨论】:

  • 请显示一些代码,尤其是当您在 PHP 中打印时间戳值时
  • SET time_zone 查询是在与获取时间戳的查询相同的请求期间进行的?
  • 我不这么认为...我现在已将其更改为:
  • $ratingresult = mysql_query("SET time_zone = timezone SELECT ID,DateTime,Name,Comment,Location,Rating FROM table1 WHERE Latitude$latdown AND Longitude $lngdown ORDER BY Rating DESC") 但这会返回错误
  • @Sam - 分成两个查询,或者使用 mysqli_multi_query

标签: php mysql


【解决方案1】:

在 MySQL 中使用多个时区可能会很棘手。

您必须非常小心地在每个会话的基础上更改时区,就像这样。除了更改您从TIMESTAMP 字段检索的显示结果(实际上是自格林威治标准时间 01-01-1970 00:00:00 起的整数秒),它还将更改插入到DATETIME 字段中的数据(实际上硬编码字符串),和/或如何评估NOW()

如果为时不晚,并且您的应用程序允许,我建议将服务器/全球时区设置为英国(并在 my.cnf 中进行相应的更改):

例如mysql&gt; SET GLOBAL time_zone = timezone; 来自http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

或者,或者,直接转换为/使用DATETIMEs —— 确保在进行转换时会话所在的时区。

【讨论】:

    【解决方案2】:

    我已经用 PHP 解决了这个问题。

    $dt_obj = new DateTime($row['DateTime'], new DateTimeZone('America/Chicago')); 
    $dt_obj->setTimezone(new DateTimeZone('Europe/London')); 
    echo $dt_obj->format('d-m-Y H:i:s');
    

    这是因为我在美国的服务器位于 CST = 芝加哥时区。我还删除了所有修改 mysql 时区的尝试。我确定更改服务器时区对某些人来说是一种解决方案,但我在共享服务器上,所以没有权限。

    我现在的问题是 - 有没有办法让我的网站在全球范围内运作?即通过检测用户运行时间?我认为这需要 javascript。

    【讨论】:

      【解决方案3】:

      请查看此代码以执行正确的结果:

      date_default_timezone_set('Europe/London');
      mysql_query("SET time_zone = '".date('P')."';");
      

      【讨论】:

      • 为什么这段代码有效?你知道这是一个 6 岁的问题吗?