11

我目前正在研究在我的网站上处理时区的最佳方法。来自许多不同国家的人会同时访问它,我必须向他们展示基于时间的信息,所以我想:

根据我的服务器(相同的时区,由 PHP 定义)将每次存储在数据库中然后,用户可以选择他的时区,我使用 mysql 函数 DATEADD 进行所需的转换。

这似乎工作正常,但我的问题是:

  • 这是最好的方法吗?
  • DATEADD 是处理小时差的最有效函数吗?

谢谢。

4

3 回答 3

7

MySQL 服务器时区支持中所述:

当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括由函数(例如NOW()or )显示的值CURTIME(),以及存储在列中和从TIMESTAMP列中检索的值。列的值TIMESTAMP从当前时区转换为 UTC 以进行存储,并从 UTC 转换为当前时区以进行检索。

因此,如果您使用TIMESTAMP类型列,MySQL 将自动为您处理时区转换:只需在其time_zone变量中为会话设置适当的时区。

于 2012-08-31T03:51:20.870 回答
2

您正在朝着正确的方向思考。

我不会使用服务器的时区。而是使用协调世界时 (UTC) 时间。它是世界时间标准。这与格林威治标准时间 (GMT) 几乎相同。请注意,UTC 不会随着夏令时而改变。

要在 PHP 中使用,请参阅: http: //php.net/manual/en/function.gmdate.php

从这里,您可以通过以下方式添加时间:http ://www.php.net/manual/en/datetime.add.php

或根据用户偏好设置时区:http ://www.php.net/manual/en/datetime.settimezone.php

您使用的是基于您如何获得用户的时区。如果您要求他们(最准确),您可以在 PHP 中设置时区,用户从组合框中进行选择。如果您使用 JavaScript 从标头中获取它,getTimezoneOffset();那么最好根据时区偏移量添加小时数。

于 2012-08-31T03:51:50.957 回答
0

我个人根据 GMT +0.00 时区在我的数据库中设置所有时间。因此,例如,当我想添加当前时间时,我使用UTC_TIMESTAMP()(或UTC_DATE(), - 以适用者为准)。UTC_TIME()这是独立于服务器的,所以我相信即使我改变了我的服务器,我将来也不需要担心这个问题。

然后选项是,如果您的访问者有机会选择他们自己的时区,您可以在提供结果之前使用DATE_ADD()DATE_SUB()函数来格式化结果。

否则,如果您有机会(这是我最喜欢的解决方案),您可以使用 Javascript 来格式化该日期/时间,您可以通过类似的方式轻松处理它

function getLocalDate(dt) {
    var d = new Date(0);
    d.setUTCSeconds(dt);
    return d.toLocaleDateString();
    // or in some format that you choose
}

它使用 .php 获取 PHP 回显的日期strtotime($row['some_date']);

于 2012-08-31T03:52:55.203 回答