首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/MySQL时区迁移

PHP/MySQL时区迁移
EN

Stack Overflow用户
提问于 2010-06-06 02:28:46
回答 1查看 2.3K关注 0票数 2

我有一个应用程序,该应用程序目前将时间戳存储在MySQL日期时间和时间戳值中。但是,应用程序需要能够接受来自多个时区的用户的数据,并在其他用户的时区中显示时间戳。因此,我计划修订有关申请,如有任何改善方法的建议,我会不胜感激。

数据库修改

  • 所有时间戳都将转换为日期时间值;这是为了确保方法的一致性,并避免让MySQL尝试做一些聪明的事情和转换时区(我希望将转换保留在PHP中,因为它涉及到对应用程序的较少修改,并且当我最终设法摆脱MySQL时,它将更易于移植)。
  • 所有日期时间值都将进行调整,以将其转换为UTC时间(目前全部位于澳大利亚东部时间)

查询修改

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

应用修改

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

附加说明

  • 转换格式将在应用程序级别进行,主要原因有几个:
    • 转换时区的方法从DB到DB各不相同,因此处理时区将是不可移植的(我真的希望在不久的将来从MySQL迁移)。
    • MySQL时间戳的范围仅限于允许的日期(1970年~2038年)
    • MySQL时间戳还有其他不受欢迎的特性,包括奇怪的自动更新行为(如果不小心禁用的话)和对服务器区域设置的敏感性(我怀疑我在今年晚些时候迁移到亚马逊时可能会搞砸这些特性)。
    • 更改所有当前日期时间值并使用UTC_TIMESTAMP()而不是NOW()的选择是避免服务器/连接时区设置出现任何问题,这将修改NOW(),但不使用UTC_TIMESTAMP();下面是一个示例。

UTC_TIMESTAMP()与NOW()的示例

代码语言:javascript
复制
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)

这里有什么我遗漏的地方吗?还是有人有更好的建议呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-06 02:53:40

这里有什么我遗漏的地方吗?还是有人有更好的建议呢?

你可能做了太多的工作。

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

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

否则,你的计划看上去周密而完整。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2982897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档