【发布时间】:2012-07-09 22:02:10
【问题描述】:
我在 MySQL DATETIME 字段中以 UTC 时区存储时间。 我想将所有这些(在 PHP 中使用它们时)转换为用户定义的时区。 我知道我可以使用 php DateTime::setTimezone 来做到这一点,但它需要为它们中的每一个都做。
是否有某种全局方式告诉 php 所有来自 mysql 的日期时间都是 UTC 并自动将它们转换为用户时区?
【问题讨论】:
我在 MySQL DATETIME 字段中以 UTC 时区存储时间。 我想将所有这些(在 PHP 中使用它们时)转换为用户定义的时区。 我知道我可以使用 php DateTime::setTimezone 来做到这一点,但它需要为它们中的每一个都做。
是否有某种全局方式告诉 php 所有来自 mysql 的日期时间都是 UTC 并自动将它们转换为用户时区?
【问题讨论】:
当您将它们存储到数据库中时,将表列存储为 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.
}
?>
【讨论】: