我目前正在研究在我的网站上处理时区的最佳方法。来自许多不同国家的人会同时访问它,我必须向他们展示基于时间的信息,所以我想:
根据我的服务器每次存储在数据库上(相同的时区,由PHP定义) 然后,用户可以选择他的时区,我使用mysql函数DATEADD进行所需的转换。
这似乎工作正常,但我的问题是:
感谢。
答案 0 :(得分:7)
如MySQL Server Time Zone Support中所述:
当前会话时区设置会影响区域敏感的时间值的显示和存储。这包括
NOW()
或CURTIME()
等函数显示的值,以及TIMESTAMP
列中存储和检索的值。TIMESTAMP
列的值将从当前时区转换为UTC以进行存储,并从UTC转换为当前时区以进行检索。
因此,如果您使用TIMESTAMP
类型列,MySQL将自动为您处理时区转换:只需在其time_zone
变量中为会话设置适当的时区。
答案 1 :(得分:2)
你正在思考正确的方向。
我不会使用服务器的时区。而是使用协调世界时(UTC)时间。这是世界时间标准。这与格林威治标准时间(格林威治标准时间)几乎相同。请注意,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中设置时区。如果您使用getTimezoneOffset();
使用JavaScript从标头中获取,则最好根据时区偏移量添加小时数。
答案 2 :(得分: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
}
使用strtotime($row['some_date']);
获取PHP回显的日期。