【问题标题】:PHP/MySQL time zone migrationPHP/MySQL 时区迁移
【发布时间】:2011-02-28 07:13:03
【问题描述】:

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

数据库修改

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

查询修改

  • 在查询、触发器、函数等中使用 NOW() 替换为 UTC_TIMESTAMP()。

应用修改

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

补充说明

  • 转换格式将在应用程序级别完成,主要原因有几个
    • 转换时区的方法因数据库而异,因此将其交给那里将是不可移植的(我真的希望在不久的将来能够从 MySQL 迁移)。
    • MySQL TIMESTAMP 的允许日期范围有限(~1970 到~2038)
    • MySQL TIMESTAMP 具有其他不良属性,包括奇怪的自动更新行为(如果不小心禁用的话)和对服务器区域设置的敏感性(我怀疑当我在今年晚些时候迁移到 Amazon 时可能会搞砸这些)。
    • 选择更改所有当前日期时间值并使用 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)

这里有什么我遗漏的吗,或者有人对这种方法有更好的建议吗?

【问题讨论】:

    标签: mysql timezone


    【解决方案1】:

    这里有什么我遗漏的吗,或者有人对这种方法有更好的建议吗?

    你可能做的太多了。

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

    您不一定需要转换所有时区在数据库中如果它们已经被认为是本地时间并且已正确配置为使用本地时区,即它们已经是自洽的。您需要做的只是在向他们呈现时间时将本地时间转换为用户的时区,并将记录的时区与时间戳一起存储(供其他用户在时间戳所有者的时区查看时间)。

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

    【讨论】:

    • 日期时间值现在是一致的,但是当我迁移服务器时,我需要将服务器设置为与当前相同的时区,即使它实际上在其他地方(我计划转移到亚马逊的新加坡位置,现在它已经启动并运行)。如果我将服务器设置为其实时时区,则 NOW() 的值会发生变化,因此时间戳之间会出现不一致,而 TIMESTAMP_UTC() 将始终相同
    • 否则,是的,带有 DateTime 类的 PHP 5.2 让事情变得比以前容易多了:) 这将是该方法的应用程序级部分。
    • 等待服务器时区切换(尤其是当您不控制服务器时)是切换到 UTC 的一个很好的理由。
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 2013-12-24
    • 2014-06-20
    • 2018-03-22
    • 2012-09-14
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多