我正在研究如何更改数据库的时区,因为我的用户群是基于英国的,但我的域名是基于美国的。我研究了很多选项,包括php,PEAR时间类和MySQL函数。对我来说,最简单的(因为它以MySQL开始和结束),涉及到更改MySQL的time_zone参数。
为了做到这一点,我刚刚尝试了MySQL的@@ global.time_zone调用(就像我开始玩它之前我会更好地理解这一点)。它产生了一大堆我没想到的参数,MySQL的网站(link text)没有提到 - 它显然是一个数组,它返回许多可识别的参数,如登录协议等,但我不能看到任何返回与时区有关的明显参数。
你对此有什么经验吗?你能建议吗? 非常感谢提前。
答案 0 :(得分:1)
处理时区有两个关键:
将所有日期/时间存储在同一时区(可以是任何时区,但使用UTC确实可以简化操作。)
确定将应用程序的日期/时间转换为/从存储时区到用户显示时区的位置。这可以在数据库抽象层,应用程序代码或页面模板(基本上是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不同,它具有内置日期时间的时区支持。
答案 1 :(得分:0)
标准做法是存储您想要以UTC(即GMT)显示的任何日期/时间,并使用javascript自动从用户的客户端获取时区,或询问用户他住在哪里。
就个人而言,我并不支持自动方法,因为许多用户没有设置正确的时区。但建议对它们进行默认设置会很有用。
无论哪种方式,一旦拥有用户的时区,只需将其添加到数据库中以UTC格式存储的时间戳,然后再显示它。