【问题标题】:What's the best way to manage dates across PHP, MySQL, etc?跨 PHP、MySQL 等管理日期的最佳方法是什么?
【发布时间】:2010-09-30 15:39:21
【问题描述】:

我的服务器在达拉斯。我在纽约市.. PHP 和 MySQL 都有用于设置时区的配置变量。

如何让他们一起工作?我应该在 MySQL 中存储哪些日期?如何让 PHP 处理根据用户偏好更改日期?

请记住:我认为我从来没有让 PHP 明确设置日期,它总是在查询中使用“NOW()”。但是我预见到需要这样做。这将如何实现?

我希望 SO 的经验可以帮助我。

【问题讨论】:

    标签: php mysql date time timezone


    【解决方案1】:

    在任何地方都使用 Unix 时间。它使用 UTC,因此每个时区都相同。日期方法通常使用它们拥有的时区信息转换为它并从它返回,因此您将拥有一个正确的时间。

    或者,您可以仅使用 Unix Time 将时间从一台计算机传输到另一台计算机(例如从数据库到运行 PHP 的服务器或 JavaScript 客户端)。每种语言都有可以转换成它和从它转换成它的功能。对于 MySQL,它是:

    UNIX_TIMESTAMP(date)
    FROM_UNIXTIME(unix_timestamp)
    

    这样您可以在数据库和日志中正确格式化您的时间,但在任何地方仍然有正确的本地时间。

    【讨论】:

    • 如何实现这个? MySQL 中的 NOW() 考虑时区
    • UNIX_TIMESTAMP() ...没关系。唯一的问题是我喜欢使用 DATETIME,因为它看起来更好看,没有 2038 错误。
    • 您只能使用时间戳在计算机之间传输时间。我已经编辑了答案以反映这一点。
    • 请注意:2038 年 1 月 19 日,Unix 时间戳将因 32 位溢出而停止工作。在此之前,数以百万计的应用程序要么需要采用新的时间戳约定,要么迁移到 64 位系统,这将为时间戳增加“一点”时间。
    【解决方案2】:

    相对于环境,我更喜欢使用原生形式的日期和时间,即 PHP 中的 Unix 时间戳和 MySQL 中的 DATE/TIME/DATETIME/TIMESTAMP 字段。我使用FROM_UNIXTIME()UNIX_TIMESTAMP() 将这两个值转换为另一个值。我更喜欢这个而不是 Unix 时间戳,因为原生日期/时间更容易阅读。

    【讨论】:

      【解决方案3】:

      mysql-server 以独立于时区的格式 (UTC) 存储日期。
      但在存储日期之前,它将使用其时区进行转换。

      你可以改变每个连接的mysql时区*1:

      mysql_query('SET time_zone = "'.$timezone.'"');
      

      您还可以更改每个脚本的时区。

      date_default_timezone_set($timezone);
      

      如果您将它们设置为相同的时区“2009-01-10 13:30:00”,则对 mysql 和 php 的含义相同。

      但请记住,这 2 个服务器具有不同的内部时钟值,因此如果您想根据当前时间生成时间戳。在 mysql 或 php 中执行此操作。

      *1) MySQL 时区支持可能需要额外的配置。检查manual

      【讨论】:

        【解决方案4】:

        以 GMT 记录您的日期(零偏移),然后根据当地时区计算偏移(例如,EST 为 +6,因此您将在 GMT 上增加 6 小时)。

        检查Date docs 中的date_default_timezone_set() 函数。

        请记住,在写入数据库时​​,您必须更改时区,存储日期,然后再更改回来。同样,当您检索日期时,不要忘记添加时区偏移量。

        【讨论】:

        • 你的回答不够清楚。有几件事需要配置:PHP 的时区、MySQL 的时区和服务器时区。你是说我应该将 MySQL 的时区设置为 GMT?
        • 很抱歉,但我仍然不明白你在这里的意思。您能否提供一个示例,用户指定他们的时区并且服务器位于,哦,比如说,达拉斯。
        • 您需要使用达拉斯时区(假设服务器设置为该时区)转换为 0 GMT 偏移量。然后,如果用户将 NY 指定为时区,则很容易将 0 GMT 偏移量转换为 EST。
        • 换句话说 2:30am PST(GMT-8) 是 10:30am GMT 将 10:30am 时间保存在 MYSQL 中,当从数据库中提取 EST(GMT-5) 时,您将显示5:30 AM ... -8 和 -5 是小时。
        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 2014-01-11
        • 2011-04-17
        • 2010-09-18
        相关资源
        最近更新 更多