我允许我的用户将事件添加到我的网络应用程序。用户可以来自世界各地。
我目前的想法是自动确定用户的时区(使用 IP 定位 API)并将其插入到用户表中(我也会允许他们更改它)。
在事件表中,我将以 UTC 格式插入事件开始日期/结束日期。
然后,每当我需要显示事件信息时,我会从表中获取事件开始日期/结束日期,并根据用户的时区进行计算。
这被认为是好的做法还是有更好的方法?
执行此操作时我应该注意什么?
谢谢,
最佳答案
是的,这的确是个好办法。还要记住,如果您在 MySQL 中使用 TIMESTAMP
类型,MySQL 会为您处理时区转换。当您向数据库中插入新的日期/时间时,MySQL 会将其从连接的时区转换为 UTC(TIMESTAMP
始终存储在 UTC 中)。当您从数据库中检索 TIMESTAMP
字段时,MySQL 会将其转换回连接的时区。
因此,如果您在 MySQL 中使用 TIMESTAMP
字段,您需要做的就是在每个页面的开头将用户的时区告诉 MySQL。你这样做:
SET time_zone = 'Europe/Helsinki'
您还可以使用数字时区:
SET time_zone = '+02:00'
请记住,您可能需要先将 tzinfo 安装到 MySQL,但这很简单(尽管仅适用于非数字版本)。以下是有关如何操作的信息:http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
简而言之,这是重要的部分:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
这是它如何工作的一个例子:
mysql> CREATE TEMPORARY TABLE test(foo TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)
mysql> SET time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO test VALUES ('2011-02-03 16:00:00');
Query OK, 1 row affected (0.00 sec)
mysql> SET time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT foo FROM test;
+---------------------+
| foo |
+---------------------+
| 2011-02-03 18:00:00 |
+---------------------+
1 row in set (0.00 sec)
如果您不使用 TIMESTAMP
字段,例如。您使用 DATETIME
(它也支持更广泛的日期),那么您只需要确保始终以 UTC 格式插入日期;为此,我始终将连接的时区设置为 +00:00
。然后,您可以在 PHP 中使用一个 View 帮助程序将日期时间转换为用户的时区,这对于 PHP 的 DateTime 来说非常简单。类和 setTimezone function .最后一个链接中有一个示例。要使用此方法,您必须确保 PHP 也设置为使用 UTC 作为其默认时区,您可以这样做:
date_default_timezone_set('UTC');
无论使用哪种方法,您都应该始终了解以下事实:
- PHP 和 MySQL 连接的时区应始终设置为相同的值,以便彼此保持一致
- 通常,将
TIMESTAMP
和DATETIME
类型混用是个坏主意 - 如果您使用
TIMESTAMP
类型,请将时区设置为用户的时区 - 如果您使用
DATETIME
类型,请将时区设置为UTC 并在PHP 中处理时区转换
关于php - 支持用户时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887283/