我允许我的用户向我的webapp添加事件。用户可以来自世界各地。
我目前的想法是自动确定用户的时区(使用IP到位置API)并将其插入到用户表中(我也允许他们更改它)。
在事件表中,我将以UTC格式插入事件开始日期/结束日期。
然后,每当我需要显示事件信息时,我会从表中获取事件开始日期/结束日期,并根据用户的时区进行计算。
这被视为良好做法还是有更好的方法来做到这一点?
这样做时我应该注意什么?
谢谢,
答案 0 :(得分:7)
是的,这确实是一个好方法。另请注意,如果您在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中拥有一个视图助手,它将日期时间转换为用户的时区,这对于PHP的DateTime类和setTimezone function来说非常简单。最后一个链接中有一个例子。要使用此方法,您必须确保PHP也设置为使用UTC作为其默认时区,您可以使用此方法:
date_default_timezone_set('UTC');
无论您使用哪种方法,都应该始终了解这些事实:
TIMESTAMP
和DATETIME
类型相互混合是个坏主意TIMESTAMP
类型,请将时区设置为用户的时区DATETIME
类型,请将时区设置为UTC并使用PHP处理时区转换答案 1 :(得分:0)
我会考虑几件事:
这种方式希望他们不会错过任何东西:)祝你的webapp好运!