1

我正在研究更改数据库时区的方法,因为我的用户群是英国的,但我的域是美国的。我研究了许多选项,包括 php、PEAR 时间类和 MySQL 函数。对我来说最简单的(主要是因为它以 MySQL 开头和结尾)涉及更改 MySQL 的 time_zone 参数。

为了准备这样做,我刚刚尝试了 MySQL 的 @@global.time_zone 调用(在我开始使用它之前我最好理解这一点)。它产生了一大堆我没想到的参数,而 MySQL 的站点(链接文本)没有提到 - 它显然是一个数组,它返回许多可识别的参数,如登录协议等,但我看不到任何明显的参数返回与时区有关的任何参数。

你有这方面的经验吗?你能建议吗?提前谢谢了。

4

2 回答 2

1

处理时区有两个关键:

  1. 将所有日期/时间存储在同一时区(可以是任何时区,但使用 UTC 确实可以简化事情。)

  2. 决定您的应用程序日期/时间将在哪里转换为/从存储时区转换为用户显示时区。这可以在数据库抽象层、应用程序代码或页面模板(基本上是 MVC 堆栈的任何部分)中完成。重要的是要保持一致。

还要记住,php 有自己的独立于 MySQL 的时区设置。如果您正在运行 php >5.1,则可以在运行时使用 date_set_default_timezone() 更改 php 时区。

如果您决定在数据库中检索/存储信息时进行时区转换,MySQL 的 convert_tz() 函数将成为您最好的新朋友。

对我来说,将时区转换作为页面模板的一部分是最简单的。日期/时间以 UTC 时区存储在数据库中,所有应用程序逻辑也以 UTC 格式保存。在 HTML 中输出日期时,我使用 php 的 date() 的包装函数来输出用户时区中的日期:

function getTimezoneOffset($time, $timezone)
{       
    $t = new DateTime(date('Y-m-d H:i:s', $time));  
    $tz = new DateTimeZone($timezone);  
    $t->setTimeZone($tz);   
    return $t->getOffset();
}
function myDate($timezone, $format, $timestamp=false)
{
    if (!$timestamp) $timestamp = time();
    return date($format, $timestamp+getTimezoneOffset($timestamp, $timezone));
}

同样,当通过表单从用户那里获取输入时,首先进行时区转换,以便您的应用程序可以使用 UTC 日期/时间。

另一种选择是使用 PostgreSQL——与 MySQL 不同,它内置了对 datetimes 的时区支持。

于 2009-11-06T20:33:36.127 回答
0

标准做法是存储您希望以 UTC(即 GMT)显示的任何日期/时间,并使用 javascript 自动从用户的客户端获取时区,或者询问用户他住在哪里。

就个人而言,我不认可自动方法,因为许多用户没有设置正确的时区。但是向他们建议默认设置可能很有用。

无论哪种方式,一旦您有了用户的时区,只需在显示它之前将其添加到数据库中存储在 UTC 中的时间戳中。

于 2009-02-22T06:51:48.613 回答