支持用户时区

时间:2011-02-03 14:21:35

标签: php mysql

我允许我的用户向我的webapp添加事件。用户可以来自世界各地。

我目前的想法是自动确定用户的时区(使用IP到位置API)并将其插入到用户表中(我也允许他们更改它)。

在事件表中,我将以UTC格式插入事件开始日期/结束日期。

然后,每当我需要显示事件信息时,我会从表中获取事件开始日期/结束日期,并根据用户的时区进行计算。

这被视为良好做法还是有更好的方法来做到这一点?

这样做时我应该注意什么?

谢谢,

2 个答案:

答案 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');

无论您使用哪种方法,都应该始终了解这些事实:

  • PHP和MySQL连接的时区应始终设置为相同的值,以便它们彼此一致
  • 一般来说,将TIMESTAMPDATETIME类型相互混合是个坏主意
  • 如果您使用TIMESTAMP类型,请将时区设置为用户的时区
  • 如果您使用DATETIME类型,请将时区设置为UTC并使用PHP处理时区转换

答案 1 :(得分:0)

我会考虑几件事:

  • 为用户提供手动设置时区的方法。
  • 假设您的用户可能会更改其位置,请让他们指定他们添加的活动的时区(如果您可以从中获取时间,则指定位置)。

这种方式希望他们不会错过任何东西:)祝你的webapp好运!