支持用户时区

Or *_*ger 2 php mysql

我允许我的用户将事件添加到我的webapp.用户可以来自世界各地.

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

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

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

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

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

谢谢,

rek*_*o_t 7

是的,这确实是一个好方法.还要记住,如果你TIMESTAMP在MySQL中使用类型,MySQL会为你处理时区转换.当您向数据库插入新的日期/时间时,MySQL会将其从连接的时区转换为UTC(TIMESTAMP始终以UTC格式存储).TIMESTAMP从数据库中检索字段时,MySQL会将其转换回连接的时区.

因此,如果您TIMESTAMP在MySQL中使用字段,那么您需要做的就是在每个页面的开头将用户的时区告诉MySQL.你这样做:

SET time_zone = 'Europe/Helsinki'
Run Code Online (Sandbox Code Playgroud)

您还可以使用数字时区:

SET time_zone = '+02:00'
Run Code Online (Sandbox Code Playgroud)

请记住,您可能需要首先将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
Run Code Online (Sandbox Code Playgroud)

这是一个如何工作的例子:

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)
Run Code Online (Sandbox Code Playgroud)

如果你不使用TIMESTAMP字段,例如.您使用DATETIME(也支持更广泛的日期),那么您只需要确保始终以UTC格式插入日期; 我这样做总是将连接的时区设置为+00:00.然后你可以在PHP中拥有一个视图助手,它将日期时间转换为用户的时区,这对于PHP的DateTime类和setTimezone函数来说非常简单.最后一个链接中有一个例子.要使用此方法,您必须确保PHP也设置为使用UTC作为其默认时区,您可以使用此方法:

date_default_timezone_set('UTC');
Run Code Online (Sandbox Code Playgroud)

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

  • PHP和MySQL连接的时区应始终设置为相同的值,以便它们彼此一致
  • 通常,混合TIMESTAMP和相互DATETIME键入是一个坏主意
  • 如果使用TIMESTAMPtype,请将时区设置为用户的时区
  • 如果使用DATETIME type,请将时区设置为UTC并在PHP中处理时区转换