【问题标题】:Dealing with Time Zones处理时区
【发布时间】:2011-06-01 14:53:02
【问题描述】:

我需要一些关于我的项目要求的指导,我正在开发一个必须处理不同时区的应用程序。

场景: 用户 1 来自印度,因此他的时区为 GMT+05:30 用户 2 来自英国,所以他的时区是 GMT+01:00

如果用户 1 向用户 2 发送消息,我想根据用户的时区显示消息发送/接收时间。例如,用户 1 在印度时间 6:30 发送一条消息,此时用户 2 会查看该消息,它会显示为英国时间 2:00。

这是我的问题,每当我保存消息时,我应该将其转换为 GMT+00,因此我所有的基本时间戳都是相同的,然后当我显示消息时,我将其转换回用户特定的时区。这会很复杂吗?这是最好的方法吗?

我喜欢获取用于保存和显示的视图,以及当我应该从优化的角度进行时间转换时。我需要处理任何/所有时区。

我正在使用 PHP 和 MySQL 开发此应用程序,并且我知道 PHP 和 MySQL 都有时区转换方法。

我只是想找出最好的方法。期待大家提出宝贵的建议。

注意:到目前为止,我不太担心日/光节约。

谢谢 拉维

【问题讨论】:

标签: php mysql timezone


【解决方案1】:

在存储消息时,转换、使用它们并将它们存储在 DST 中性时区 - 例如,UTC 或 GMT。

使用它们存储原始时区偏移量和 DST 偏移量 - 这将有助于业务逻辑。

显示消息时,使用此数据并转换为本地时间。

有关使用不同时区的最佳实践,请参阅this 问答。

【讨论】:

    【解决方案2】:

    这是我的问题,每当我保存消息时,我应该将其转换为 GMT+00,因此我所有的基本时间戳都是相同的,然后当我显示消息时,我将其转换回用户特定的时区。这会很复杂吗?这是最好的方法吗?

    是的。唯一需要注意的是允许每个用户指定他们想要的时区来查看时间(作为首选项,或者从他们的客户端系统的设置或从用户数据库)。

    我喜欢获取用于保存和显示的视图,以及当我应该从优化的角度进行时间转换时。我需要处理任何/所有时区。

    从客户端转换为 GMT 的最佳时间是在您的“业务”逻辑中 - 基本上,无论您拥有处理 Web 表单数据的任何逻辑。不在数据库端。

    从 GMT 转换到客户端进行查看的最佳时间是在表示层之前/之中,例如当您打印 HTML 时。

    原因是这样,尽可能少的代码需要担心时区。

    注意如果/当您需要执行任何特定于日期的逻辑(例如,基于日期而不是仅向用户打印时间戳)时,此时区相关逻辑会变得非常复杂。

    【讨论】:

      【解决方案3】:

      将数据保存到数据库时,请使用以下内容:

      INSERT INTO TableName SET TheDateFile=UTC_TIMESTAMP()
      

      然后,假设您允许每个用户指定他们自己的时区,您将需要在业务逻辑中转换日期(如 DVK 所述)

      类似:

      DATE_FORMAT(DATE_ADD(TheDateField, INTERVAL 2 HOUR)  // or whatever value
      

      我自己没有这样做,但我想根据用户时区存储小时间隔很简单。

      【讨论】:

        【解决方案4】:

        在任何情况下,如果您与不同时区的用户打交道,您必须将时区与日期分开。我很久以前就听说过 wordpress 也是这样做的:

        • 第一步,确定日期的时区
        • 第二步,设置日期的时区为GMT(+0)
        • 第三步,将时区和 GMT 日期存储在两个单独的列中。

        无论如何,如果您需要更多信息,有一个帖子here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 2016-02-29
          • 2015-08-31
          相关资源
          最近更新 更多