2
我有一个应用程序,当前在MySQL DATETIME和TIMESTAMP值中存储时间戳。但是,应用程序需要能够接受来自多个时区的用户的数据,并在其他用户的时区中显示时间戳。因此,这是我打算修改申请的方式;我希望有任何改进方法的建议。PHP/MySQL时区迁移
数据库修改
- 所有时间戳将被转换为DATETIME值;这是为了确保方法的一致性,并避免让MySQL尝试做出聪明的事情并转换时区(我想在PHP中保留转换,因为它涉及对应用程序的较少修改,并且在我最终设法从MySQL中逃脱)。
- 所有DATETIME值进行调整,以将它们转换为UTC时间(目前都在澳大利亚东部标准时间)
查询修改
- 现在所有使用()与UTC_TIMESTAMP)来代替(在查询,触发器,函数等
应用修改
- 应用程序必须存储时区和首选日期格式(例如,美国VS世界的其余部分)
- 的所有时间将根据用户的设置显示
- 所有输入时间戳将根据用户的设置转换为UTC之前被输入
附加之前转换笔记
- 转换格式,将在应用层面做了几个主要的原因
- 的一个转换时区的过程因数据库和数据库而异,因此将其转换为非便携式(并且我希望在不久的将来可能会从MySQL中迁移出来)。
- MySQL时间戳具有有限的范围,以允许时间(〜1970至〜2038)
- MySQL时间戳具有其它不希望的属性,包括奇异自动更新行为(如果不仔细禁用)和灵敏度到服务器区设置(和我怀疑我在今年晚些时候迁移到亚马逊时可能会搞砸这些)。
- 改变所有当前日期时间值并使用UTC_TIMESTAMP()代替NOW()的选择是为了避免服务器/连接时区设置出现任何问题,这将会修改NOW()但仅保留UTC_TIMESTAMP();见下面的例子。
VS UTC_TIMESTAMP()的实例NOW()
mysql> set time_zone = 'Australia/Canberra';
Query OK, 0 rows affected (0.06 sec)
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now() | utc_timestamp() |
+---------------------+---------------------+
| 2010-06-06 14:31:36 | 2010-06-06 04:31:36 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = 'America/Los_Angeles';
Query OK, 0 rows affected (0.00 sec)
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now() | utc_timestamp() |
+---------------------+---------------------+
| 2010-06-05 21:31:43 | 2010-06-06 04:31:43 |
+---------------------+---------------------+
1 row in set (0.00 sec)
有什么,我在这里失踪,或有没有人有办法更好的建议?
现在日期时间值是一致的,但是当我迁移服务器时,我需要将服务器设置为与当前时区相同,即使它实际上位于其他地方(我计划转移到Amazon的新加坡的位置,现在它正在运行)。如果我将服务器设置为其实时区,则NOW()的值将发生变化,以便时间戳之间存在不一致性,而TIMESTAMP_UTC()将始终保持相同 – 2010-06-06 03:27:48
否则,是,PHP 5.2带有DateTime类使事情变得比以前更容易:)这将是该方法的应用程序级别部分。 – 2010-06-06 03:28:32
正在等待服务器时区切换(尤其是当您不控制服务器时)是切换到UTC的一个非常好的理由。 – Charles 2010-06-06 04:55:31