2010-06-06 30 views
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) 

有什么,我在这里失踪,或有没有人有办法更好的建议?

回答

1

有什么我在这里失踪,或没有人有更好的方法建议吗?

你可能做了太多工作。

只要知道存储的时间戳的时区,就可以轻松地将其转换为另一个时区。如果您使用的是现代版本的PHP,则内置DateTime class包含全面的时区管理。

你不一定需要所有时区转换在数据库如果他们已经考虑当地的时间,它被正确配置为使用本地时区,即他们已经自洽。您只需简单地将当地时间转换为用户的时区,然后将时间记录到时间戳中(其他用户在时间戳记所有者的时区中查看时间)即可。

否则,您的计划似乎经过深思熟虑和完整。

+0

现在日期时间值是一致的,但是当我迁移服务器时,我需要将服务器设置为与当前时区相同,即使它实际上位于其他地方(我计划转移到Amazon的新加坡的位置,现在它正在运行)。如果我将服务器设置为其实时区,则NOW()的值将发生变化,以便时间戳之间存在不一致性,而TIMESTAMP_UTC()将始终保持相同 – 2010-06-06 03:27:48

+0

否则,是,PHP 5.2带有DateTime类使事情变得比以前更容易:)这将是该方法的应用程序级别部分。 – 2010-06-06 03:28:32

+0

正在等待服务器时区切换(尤其是当您不控制服务器时)是切换到UTC的一个非常好的理由。 – Charles 2010-06-06 04:55:31