我目前正在研究在我的网站上处理时区的最佳方法。来自许多不同国家的人会同时访问它,我必须向他们展示基于时间的信息,所以我想:
根据我的服务器(相同的时区,由 PHP 定义)将每次存储在数据库中然后,用户可以选择他的时区,我使用 mysql 函数 DATEADD 进行所需的转换。
这似乎工作正常,但我的问题是:
- 这是最好的方法吗?
- DATEADD 是处理小时差的最有效函数吗?
谢谢。
如MySQL 服务器时区支持中所述:
当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括由函数(例如
NOW()
or )显示的值CURTIME()
,以及存储在列中和从TIMESTAMP
列中检索的值。列的值TIMESTAMP
从当前时区转换为 UTC 以进行存储,并从 UTC 转换为当前时区以进行检索。
因此,如果您使用TIMESTAMP
类型列,MySQL 将自动为您处理时区转换:只需在其time_zone
变量中为会话设置适当的时区。
您正在朝着正确的方向思考。
我不会使用服务器的时区。而是使用协调世界时 (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();
那么最好根据时区偏移量添加小时数。
我个人根据 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']);
。