【问题标题】:building timezone feature in PHP web application在 PHP Web 应用程序中构建时区功能
【发布时间】:2010-10-22 02:01:30
【问题描述】:

这与这个问题几乎相似:-

Dealing with timezones in PHP

我读了那个帖子,还有一些问题,不知道如何在 PHP/MySQL 应用程序中优雅地构建时区支持。

我正在用 PHP 编写一个应用程序,用户可以在其中选择他们的时区。

这里,所有时间戳都存储在 MySQL 中的 GMT 中。在呈现数据时,我正在将时区转换回用户时区。

现在这些是我面临的问题:-

1) 我向用户展示了一个从 MySQL 的时区表中填充的时区列表,这是一个巨大的列表,很难从中选择。

所以,我想实现类似 Windows 时区列表的东西。与地区信息的偏移量。

2) PHP 和 MySQL 可能有不同的列表集。

3) 我应该在哪里转换时区,在 PHP 中还是在 MySQL 中?我有编码的组合。 有时很容易选择从 MySQL 转换的列,有时很容易在 PHP 中转换。 所以,这里前一点变得非常重要。例如,在 MySQL 的 time_zone 表中 Asia/Kolkata 和 Asia/Calcutta 都存在,但在 PHP 5.2.6 的默认 timezonedb 中,只有 Asia/Calcutta 存在。

【问题讨论】:

    标签: php mysql timezone


    【解决方案1】:
    1. 从一个大列表中选择一个时区并不难。按标准时间偏移对列表进行排序,以便用户可以快速滚动到正确的偏移,并从那里查找他们的确切位置。

    2. 选择一个列表。我倾向于选择较短的列表。只向用户展示这些选择。

    3. 计算所选列表的位置。如果您要显示 MySQL 列表,请让 MySQL 进行日期数学运算,如果您使用 PHP 的列表,请让 PHP 进行数学运算。这样一来,您就无需在一个实现中为缺少的区域找出一些奇怪的映射。

    一个奇特的解决方案可能涉及询问用户的位置并推断他们的时区。 (但是,也可以选择显式设置)

    【讨论】:

      【解决方案2】:

      在这种情况下,自定义类可能是最佳解决方案。然后,您可以使用其时区移动时间和日期。幸运的是,PHP v5 就内置了这样一个对象。您只需要记住编写代码,以便当您依赖隐式时区时,这是因为您知道您之前已经明确设置了它。这也意味着如果你不知道隐含的价值是什么,你去问,有效地使其明确。

      看看 PHP 的时区支持和 MySQL 的时区支持,我会主要在 PHP 中做时区的工作。 MySQL 的支持主要围绕它的“现在”概念。

      哦,是的:您确实想要进行明确的日期算术(例如,添加 86400 秒来添加“一天”)。让 PHP 对象或库来做这件事。他们将修复您不会想到的错误。 (我曾经为一种特殊类型的日期操作编写了一个对象,并花了数周时间与一个间歇性的一小时间隔错误作斗争,直到我发现添加 86400 来进行一天转换而不是使用 mktime() 的地方。事实证明,夏令时规则把事情搞砸了。当然,我没有检查。)

      【讨论】:

        【解决方案3】:

        当遇到这个确切的问题时,我找到了this reference,它将简洁的 Windows 风格时区列表映射到荒谬详尽的 Unix 风格时区列表的子集。

        用户会看到这些窗口样式名称的下拉列表(例如,(GMT-05:00) 东部时间(美国和加拿大)),他们的选择以 unix 样式格式存储在数据库中(例如美国/纽约)

        应用用户时区偏好的工作是在显示时在 PHP 中使用DateTime class 完成的。我想我会推荐这个,这样您就可以确信您在 SQL/PHP 中操作的日期始终采用 UTC,直到它们显示出来。

        【讨论】:

        • 仍然,我必须执行一些查询,我必须在 MySQL 中转换时区。否则,这将导致 100 个用户的 100 个查询。 JOIN 无法有效使用。
        • 有什么理由不能在运行时计算出这样的列表?作为一项额外的好处,Olson 数据库始终是最新的......
        • 链接已损坏。你知道我在哪里可以找到这个解决方案吗?我需要在 PHP 中创建一个用户友好的时区选择框,您提供的链接听起来很适合我需要做的事情。
        • @Nathan 我很沮丧那个链接已经死了。这是我的 PHP 映射端口:gist.github.com/frankfarmer/6126446
        猜你喜欢
        • 1970-01-01
        • 2012-08-06
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-05-16
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        相关资源
        最近更新 更多