PHP / MySQL时区迁移

时间:2010-06-06 02:28:46

标签: mysql timezone

我有一个应用程序,它当前在MySQL DATETIME和TIMESTAMP值中存储时间戳。但是,应用程序需要能够接受来自多个时区的用户的数据,并在其他用户的时区中显示时间戳。因此,这就是我计划修改申请的方式;我将不胜感激任何改进方法的建议。

数据库修改

  • 所有TIMESTAMP都将转换为DATETIME值;这是为了确保方法的一致性,并避免让MySQL尝试做巧妙的事情并转换时区(我想在PHP中保持转换,因为它涉及对应用程序的较少修改,并且当我最终设法时将更加可移植逃离MySQL)。
  • 将调整所有DATETIME值以将其转换为UTC时间(目前全部在澳大利亚东部时间)

查询修改

  • NOW()的所有用法将在查询,触发器,函数等中替换为UTC_TIMESTAMP()。

申请修改

  • 应用程序必须存储时区和首选日期格式(例如,美国与世界其他地区)
  • 所有时间戳将在显示之前根据用户设置进行转换
  • 在输入之前,所有输入时间戳将根据用户设置转换为UTC

附加说明

  • 转换格式将在应用程序级别完成,主要有几个原因
    • 转换时区的方法因数据库而异,因此将其交给那里将是不可移植的(我真的希望在不远的将来一段时间内从MySQL迁移出来)。
    • MySQL TIMESTAMPs的允许日期范围有限(~1970至~2038)
    • MySQL TIMESTAMPs还有其他不受欢迎的属性,包括奇怪的自动更新行为(如果没有小心禁用)和对服务器区域设置的敏感性(我怀疑在今年晚些时候迁移到亚马逊时我可能会搞砸这些)。 / LI>
    • 更改所有当前日期时间值以及使用UTC_TIMESTAMP()而不是NOW()的选择是避免服务器/连接时区设置的任何问题,这将修改NOW()但仅保留UTC_TIMESTAMP();见下面的例子。

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 个答案:

答案 0 :(得分:1)

  

我在这里缺少什么,或者有没有人对这种方法有更好的建议?

你可能做得太多了。

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

您不一定需要转换数据库中的所有时区,如果它们已被视为本地时间并且已正确配置为使用本地时区,即他们已经是自我一致的了。您需要做的只是在将时间转换为用户的时区时将当地时间转换为用户的时区,并将带有时间戳的记录时区存储(对于在时间戳所有者的时区中查看时间的其他用户)。 / p>

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