php - 支持用户时区

标签 php mysql

我允许我的用户将事件添加到我的网络应用程序。用户可以来自世界各地。

我目前的想法是自动确定用户的时区(使用 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 连接的时区应始终设置为相同的值,以便彼此保持一致
  • 通常,将 TIMESTAMPDATETIME 类型混用是个坏主意
  • 如果您使用TIMESTAMP类型,请将时区设置为用户的时区
  • 如果您使用DATETIME 类型,请将时区设置为UTC 并在PHP 中处理时区转换

关于php - 支持用户时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887283/

相关文章:

mysql - sql语句中的减法

MYSQL 查询查找类似于连接字符串的字符串

php - 在 AJAX 调用文件中允许 javascript

php - CakePHP 3 : Preselect checkboxes when editing belongsToMany Model

mysql - 帮助使用 phpMyAdmin 将 Excel 文件导入 MySQL

php - 如何在 CodeIgniter 中使用查询生成器从两个表中选择数据?

c# - 使用 PHP 脚本为桌面应用程序建立 MySQL 连接

php - 如何匹配与一组特定的其他记录关联的记录?

php - 无法在 MySQL PHP 表单中显示记录字段更新结果

PHP MYSQL - 根据特定类别添加项目