【问题标题】:MySQL and PHP working with user timezonesMySQL 和 PHP 使用用户时区
【发布时间】:2012-07-09 22:02:10
【问题描述】:

我在 MySQL DATETIME 字段中以 UTC 时区存储时间。 我想将所有这些(在 PHP 中使用它们时)转换为用户定义的时区。 我知道我可以使用 php DateTime::setTimezone 来做到这一点,但它需要为它们中的每一个都做。

是否有某种全局方式告诉 php 所有来自 mysql 的日期时间都是 UTC 并自动将它们转换为用户时区?

【问题讨论】:

  • 我最近问过这些问题。见this onemore
  • 在我的答案中添加了一个 PHP 函数,它将 UTC 时间解析为用户时间。当你从数据库中取回数据时调用它。

标签: php mysql timezone


【解决方案1】:

当您将它们存储到数据库中时,将表列存储为 unix 时间戳。这些都是UTC。然后只需应用您想要的任何用户指定的偏移量。

这是一个有趣的StackOverflow question,它可能会对您有所帮助。

您还可以使用MySQL Unix_Timestamp function 在进行比较时生成正确的 int 来轻松查询数据。

编辑: 如果您确定每次使用数据库时都想转换数据库中的所有日期时间,只需编写一个简单的函数来获取日期时间并为用户添加正确的偏移量,然后在每次提取日期时间时调用该函数从数据库。像下面的代码:

<?php

    // Assuming that $_SESSION['UserOffset'] is storing the user's timezone eg
    // $_SESSION['UserOffset'] = new DateTimeZone("Europe/Prague");

    function convert_time_zone($timeFromDatabase_time)
    {
        $userTime = new DateTime($timeFromDatabase, new DateTimeZone('UTC'));
        $userTime->setTimezone(new DateTimeZone($_SESSION['UserOffset']));
        return $userTime->format('Y-m-d H:i:s');
        // or return $userTime; // if you want to return a DateTime object.
    }


?>

【讨论】:

  • 如果我想使用 datetime 列怎么办(它比时间戳有一些好处)?
  • 这也需要在每次调用时完成,因此与使用 DateTime() 对象相比,工作量并不少。时间戳也不是GMT,而是UTC。此外,时间戳无法存储历史日期,调试也更加困难,因为大多数人无法像普通的日期/时间符号那样读取时间戳。
  • php如何获取时区的偏移量?
  • 您要么让用户设置他们的时区(并存储在会话或 cookie 中),要么使用一些 ajax,网上有很多例子可以做到这一点。不管你得到它,一旦你得到它,很容易让 PHP 完成转换输出的工作。
  • 是的,我选择了这样的东西。我正在使用数据库层,并对其进行了修改以执行 new DateTime($date, new DateTimeZone('UTC'));当列类型为日期时间时。我使用 date_default_timezone_set($userTimeZone)。一切都很好。
猜你喜欢
  • 2011-11-06
  • 2011-08-11
  • 2015-11-22
  • 2011-06-02
  • 1970-01-01
  • 2023-04-06
  • 2011-06-14
相关资源
最近更新 更多