是的,这确实是一个好方法.还要记住,如果你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)
无论使用哪种方法,您都应该始终了解这些事实:
TIMESTAMP和相互DATETIME键入是一个坏主意TIMESTAMPtype,请将时区设置为用户的时区DATETIME type,请将时区设置为UTC并在PHP中处理时区转换